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

Artifact 47343e340df799199fd1f1a184f0df8861519e1e:


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 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74   TODO: Really, t
afe0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
aff0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
b000: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
b010: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
b020: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
b030: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
b040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
b050: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
b060: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = 0;..    rc = o
b070: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b080: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
b090: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
b0a0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b0b0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
b0c0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
b0d0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
b0e0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
b0f0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
b100: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
b110: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
b120: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
b130: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
b140: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
b150: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
b160: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
b170: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
b180: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
b190: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
b1a0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
b1b0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
b1c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
b1d0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
b1e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b1f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
b200: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
b210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b220: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
b230: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
b240: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
b250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
b260: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
b270: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
b280: 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NLOCK;.  }.}../*
b290: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b2a0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
b2b0: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
b2c0: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
b2d0: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
b2e0: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68  ave occurred. Th
b2f0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b300: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
b310: 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73   the pager .** s
b320: 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
b330: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
b340: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
b350: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
b360: 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63  ger .** API func
b370: 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
b380: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
b390: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
b3a0: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
b3b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
b3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
b3d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
b3e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
b3f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
b400: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
b410: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
b420: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
b430: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
b440: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
b450: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
b460: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
b470: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
b480: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
b490: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
b4a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
b4b0: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
b4c0: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
b4d0: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
b4e0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
b4f0: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
b500: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
b510: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
b520: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
b530: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
b540: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
b550: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
b560: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
b570: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
b580: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
b590: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
b5a0: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
b5b0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
b5c0: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
b5d0: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
b5e0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
b5f0: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
b600: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
b610: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
b620: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
b630: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
b640: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
b650: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
b660: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
b670: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
b680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
b690: 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
b6a0: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
b6b0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b6c0: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
b6d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
b6e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
b6f0: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
b700: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
b710: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
b720: 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
b730: 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
b740: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
b750: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b760: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
b770: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b780: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
b790: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
b7a0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
b7b0: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
b7c0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
b7d0: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
b7e0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
b7f0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
b800: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
b810: 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
b820: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
b830: 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
b840: 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
b850: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
b860: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
b870: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
b880: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
b890: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
b8a0: 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
b8b0: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
b8c0: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
b8d0: 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
b8e0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
b8f0: 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
b900: 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
b910: 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
b920: 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
b930: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
b940: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
b950: 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
b960: 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
b970: 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
b980: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
b990: 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
b9a0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
b9b0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
b9c0: 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
b9d0: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
b9e0: 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
b9f0: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
ba00: 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
ba10: 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
ba20: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
ba30: 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
ba40: 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
ba50: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
ba60: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
ba70: 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
ba80: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
ba90: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
baa0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
bab0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
bac0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
bad0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode==SQLITE_OK &
bae0: 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
baf0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
bb00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
bb10: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
bb20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
bb30: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
bb40: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
bb50: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
bb60: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
bb70: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
bb80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
bb90: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
bba0: 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
bbb0: 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
bbc0: 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
bbd0: 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
bbe0: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
bbf0: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
bc00: 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
bc10: 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
bc20: 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
bc30: 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
bc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
bc50: 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
bc60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bc70: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
bc80: 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
bc90: 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
bca0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
bcb0: 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  ction..** .** If
bcc0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
bcd0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72   PAGER_SHARED or
bce0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
bcf0: 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
bd00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bd10: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
bd20: 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54  p (returns SQLIT
bd30: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  E_OK)..**.** Oth
bd40: 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
bd50: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
bd60: 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
bd70: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
bd80: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
bd90: 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
bda0: 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
bdb0: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
bdc0: 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
bdd0: 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
bde0: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
bdf0: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
be00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
be10: 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
be20: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
be30: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
be40: 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
be50: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
be60: 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
be70: 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
be80: 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
be90: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
bea0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
beb0: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
bec0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
bed0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
bee0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
bef0: 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
bf00: 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
bf10: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bf20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
bf30: 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
bf40: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
bf50: 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
bf60: 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
bf70: 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
bf80: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
bf90: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
bfa0: 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
bfb0: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
bfc0: 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
bfd0: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
bfe0: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
bff0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
c000: 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
c010: 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
c020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c030: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
c040: 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
c050: 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
c060: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
c070: 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
c080: 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
c090: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
c0a0: 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
c0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
c0c0: 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
c0d0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
c0e0: 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
c0f0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
c100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
c110: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
c120: 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
c130: 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
c140: 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
c150: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
c160: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
c170: 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
c180: 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
c190: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
c1a0: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
c1b0: 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
c1c0: 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
c1d0: 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
c1e0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
c1f0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c200: 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
c210: 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
c220: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
c230: 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
c240: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
c250: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
c260: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20  s finalized, if 
c270: 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
c280: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c290: 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65  he.** pager move
c2a0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
c2b0: 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77  D state (and dow
c2c0: 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b  ngrades the lock
c2d0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
c2e0: 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69  ase file accordi
c2f0: 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ngly)..**.** If 
c300: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
c310: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
c320: 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e  e mode and is in
c330: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74   PAGER_SYNCED st
c340: 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73  ate,.** it moves
c350: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
c360: 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72  IVE. No locks ar
c370: 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65  e downgraded whe
c380: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20  n running in.** 
c390: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
c3a0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
c3b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
c3c0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
c3d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c3e0: 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
c3f0: 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
c400: 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
c410: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
c420: 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
c430: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
c440: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
c450: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
c460: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
c470: 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
c480: 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
c490: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c4a0: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
c4b0: 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
c4c0: 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
c4d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
c4e0: 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
c4f0: 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
c500: 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
c510: 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
c520: 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
c530: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
c540: 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
c550: 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
c560: 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
c570: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
c580: 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
c590: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
c5a0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
c5b0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
c5c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
c5d0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
c5e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c5f0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
c600: 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
c610: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
c620: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
c630: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
c640: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
c650: 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
c660: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
c670: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
c680: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
c690: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
c6a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c6b0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
c6c0: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
c6d0: 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  r);..  assert( i
c6e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
c6f0: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
c700: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
c710: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
c720: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20 20  er->jfd) ){..   
c730: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
c740: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
c750: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
c760: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
c770: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
c780: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c790: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
c7a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
c7b0: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
c7c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c7d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c7e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( 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 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
c820: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
c830: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
c840: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
c880: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
c890: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
c8a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c8b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
c8c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c8d0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c8e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
c8f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c900: 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50  Mode .     || pP
c910: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c920: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c930: 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
c940: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
c950: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
c960: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
c970: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
c980: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
c990: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c9a0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
c9b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c9c0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c9e0: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
c9f0: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
ca00: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
ca10: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
ca20: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
ca30: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
ca40: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
ca50: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
ca60: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ca70: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
ca80: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
ca90: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
caa0: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
cab0: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
cac0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
cad0: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
cae0: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
caf0: 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  ournal.  */.    
cb00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cb10: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
cb20: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
cb30: 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20  _DELETE .       
cb40: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
cb50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cb60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
cb70: 4d 4f 52 59 20 0a 20 20 20 20 20 20 29 3b 0a 20  MORY .      );. 
cb80: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
cb90: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
cba0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
cbb0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
cbc0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cbd0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
cbe0: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
cbf0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
cc00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cc10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
cc20: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
cc30: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
cc40: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
cc50: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
cc60: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
cc70: 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
cc80: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
cc90: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
cca0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
ccb0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
ccc0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
ccd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
cce0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
ccf0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
cd00: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  0;.  }..  if( !p
cd10: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cd20: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
cd30: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
cd40: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
cd50: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
cd60: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
cd70: 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65  HARED;.    pPage
cd80: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
cd90: 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ne = 0;.  }else 
cda0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
cdb0: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
cdc0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
cdd0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
cde0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
cdf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
ce00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
ce10: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
ce20: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
ce30: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44  d = 0;..  /* TOD
ce40: 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d  O: Is this optim
ce50: 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65 20 64  al? Why is the d
ce60: 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74  b size invalidat
ce70: 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68  ed here .  ** wh
ce80: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
ce90: 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f  file is not unlo
cea0: 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65  cked? */.  pPage
ceb0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
cec0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
ced0: 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
cee0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
cef0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
cf00: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
cf10: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
cf20: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  alid = 0;.  }.. 
cf30: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
cf40: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
cf50: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
cf60: 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
cf70: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cf80: 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
cf90: 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
cfa0: 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
cfb0: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
cfc0: 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
cfd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
cfe0: 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
cff0: 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
d000: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
d010: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
d020: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
d030: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
d040: 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
d050: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d060: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d070: 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
d080: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
d090: 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
d0a0: 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
d0b0: 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
d0c0: 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
d0d0: 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
d0e0: 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
d0f0: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
d100: 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
d110: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
d120: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
d130: 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
d140: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
d150: 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
d160: 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
d170: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
d180: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
d190: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
d1a0: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
d1b0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
d1c0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
d1d0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
d1e0: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
d1f0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
d200: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
d210: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
d220: 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
d230: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
d240: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
d250: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
d260: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
d270: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
d280: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
d290: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
d2a0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
d2b0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
d2c0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
d2d0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
d2e0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
d2f0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
d300: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
d310: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
d320: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
d330: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
d340: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
d350: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
d360: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
d370: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
d380: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
d390: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
d3a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
d3b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d3c0: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
d3d0: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
d3e0: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
d3f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d400: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
d410: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
d420: 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
d430: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d440: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
d450: 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
d460: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
d470: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
d480: 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
d490: 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
d4a0: 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
d4b0: 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
d4c0: 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
d4d0: 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
d4e0: 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
d4f0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
d500: 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
d510: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
d520: 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a  *.** The isMainJ
d530: 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  rnl flag is true
d540: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
d550: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
d560: 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c  urnal and.** fal
d570: 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  se for the state
d580: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
d590: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d5a0: 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a   journal uses.**
d5b0: 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
d5c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d5d0: 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a  al does not..**.
d5e0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
d5f0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
d600: 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
d610: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d620: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
d630: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d640: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
d650: 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
d660: 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
d670: 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
d680: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
d690: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
d6a0: 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
d6b0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
d6c0: 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
d6d0: 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
d6e0: 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
d6f0: 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
d700: 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
d710: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
d720: 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
d730: 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
d740: 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
d750: 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
d760: 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
d770: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
d780: 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
d790: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
d7a0: 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
d7b0: 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
d7c0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
d7d0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
d7e0: 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
d7f0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
d800: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d810: 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
d820: 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
d830: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
d840: 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
d850: 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
d860: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
d870: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
d880: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d890: 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
d8a0: 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
d8b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
d8c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
d8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d8e0: 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
d8f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
d900: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d910: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
d920: 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
d930: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
d940: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
d950: 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
d960: 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
d970: 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
d980: 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
d990: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
d9a0: 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
d9b0: 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
d9c0: 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
d9d0: 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
d9e0: 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
d9f0: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
da00: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
da20: 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
da30: 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
da40: 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
da50: 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
da60: 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
da70: 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
da80: 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
da90: 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
daa0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
dab0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
dac0: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
dad0: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
dae0: 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
daf0: 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
db00: 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
db10: 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
db20: 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
db30: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
db40: 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
db50: 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
db60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
db70: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
db80: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
db90: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
dba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dbb0: 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
dbc0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
dbd0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
dbf0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
dc00: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
dc10: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e  l. */.  int isUn
dc20: 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  sync,           
dc30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
dc40: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 75 6e   reading from un
dc50: 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75 72  synced main jour
dc60: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  nal */.  i64 *pO
dc70: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
dc80: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
dc90: 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
dca0: 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  ayback */.  int 
dcb0: 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20  isSavepnt,      
dcc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
dcd0: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
dce0: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t rollback */.  
dcf0: 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20  Bitvec *pDone   
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd10: 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
dd20: 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
dd30: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
dd40: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
dd50: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
dd60: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
dd70: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
dd80: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
dd90: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
dda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ddb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
ddc0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
ddd0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
de00: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
de10: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
de20: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
de30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
de40: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
de50: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
de60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
de70: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
de80: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
de90: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
dea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
deb0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
dec0: 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
ded0: 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
dee0: 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
def0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
df00: 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
df10: 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
df20: 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
df30: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
df40: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
df50: 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
df60: 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
df70: 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
df80: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
df90: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
dfa0: 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
dfb0: 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
dfc0: 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
dfd0: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
dfe0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
dff0: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
e000: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
e010: 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
e020: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
e030: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 2f  llocated */..  /
e040: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
e050: 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
e060: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
e070: 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
e080: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
e090: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
e0a0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
e0b0: 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
e0c0: 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
e0d0: 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
e0e0: 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
e0f0: 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
e100: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e110: 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
e120: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
e130: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
e140: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
e150: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
e160: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
e170: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
e180: 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
e190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e1a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
e1b0: 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
e1c0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
e1d0: 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
e1e0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
e1f0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
e200: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
e210: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
e220: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
e230: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
e240: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
e250: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
e260: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
e270: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
e280: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
e290: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
e2a0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e2b0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
e2c0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
e2d0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
e2e0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
e2f0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
e300: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
e310: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
e320: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
e330: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
e340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
e350: 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
e360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e370: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
e380: 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
e390: 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
e3a0: 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
e3b0: 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
e3c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e3d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
e3e0: 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
e3f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e400: 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
e410: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
e420: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
e430: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
e440: 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
e450: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
e460: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
e470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e480: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
e490: 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  ..  if( pDone &&
e4a0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
e4b0: 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
e4c0: 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
e4d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e4e0: 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
e4f0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
e500: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
e510: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
e520: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
e530: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
e540: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
e550: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
e560: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
e570: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
e580: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
e590: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
e5a0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
e5b0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e5c0: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
e5d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e5e0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e5f0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
e600: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
e610: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
e620: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
e630: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
e640: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
e650: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
e660: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
e670: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
e680: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
e690: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
e6a0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
e6b0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
e6c0: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
e6d0: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
e6e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
e6f0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
e700: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
e710: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
e720: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
e730: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
e740: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
e750: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
e760: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
e770: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
e780: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
e790: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
e7a0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
e7b0: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
e7c0: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
e7d0: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
e7e0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
e7f0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
e800: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
e810: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
e820: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
e830: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e840: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
e850: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
e860: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
e870: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
e880: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
e890: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
e8a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
e8b0: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
e8c0: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
e8d0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
e8e0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
e8f0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
e900: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
e910: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
e920: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
e930: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
e940: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
e950: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
e960: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
e970: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
e980: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
e990: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
e9a0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
e9b0: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
e9c0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
e9d0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
e9e0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
e9f0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
ea00: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
ea10: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
ea20: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
ea30: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
ea40: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
ea50: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
ea60: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
ea70: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
ea80: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
ea90: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
eaa0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
eab0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
eac0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
ead0: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
eae0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
eaf0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
eb00: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
eb10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
eb20: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
eb30: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
eb40: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
eb50: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
eb60: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
eb70: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
eb80: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
eb90: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
eba0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
ebb0: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
ebc0: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
ebd0: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
ebe0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
ebf0: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
ec00: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
ec10: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
ec20: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
ec30: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
ec40: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
ec50: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
ec60: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
ec70: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
ec80: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
ec90: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
eca0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
ecb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
ecc0: 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
ecd0: 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
ece0: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
ecf0: 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
ed00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ed10: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
ed20: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
ed30: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
ed40: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
ed50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ed60: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
ed70: 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
ed80: 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
ed90: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
eda0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
edb0: 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28 70  LUSIVE).   && (p
edc0: 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
edd0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
ede0: 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20  ED_SYNC)).   && 
edf0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
ee00: 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79  d).   && !isUnsy
ee10: 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  nc.  ){.    i64 
ee20: 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
ee30: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
ee40: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
ee50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
ee60: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
ee70: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ee80: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
ee90: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
eea0: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
eeb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
eec0: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
eed0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
eee0: 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
eef0: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef00: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef10: 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
ef20: 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
ef30: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
ef40: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
ef50: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 3b 0a  , pgno, aData);.
ef60: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef70: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef80: 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 0, rc=SQLITE_N
ef90: 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMEM);.    }.  }
efa0: 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
efb0: 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
efc0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
efd0: 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
efe0: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
eff0: 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
f000: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
f010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
f020: 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
f030: 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
f040: 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
f050: 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
f060: 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
f070: 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
f080: 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
f090: 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
f0a0: 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
f0b0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
f0c0: 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
f0d0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
f0e0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
f0f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
f100: 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
f110: 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
f120: 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
f130: 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
f140: 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
f150: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
f160: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
f170: 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
f180: 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
f190: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
f1a0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
f1b0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
f1c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
f1d0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
f1e0: 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
f1f0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
f200: 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
f210: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f220: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
f230: 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
f240: 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
f250: 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
f260: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
f270: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
f280: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
f290: 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
f2a0: 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
f2b0: 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
f2c0: 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
f2d0: 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
f2e0: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
f2f0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
f300: 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
f310: 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
f320: 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
f330: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
f340: 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72  nt );.    if( (r
f350: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f360: 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
f370: 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21  pgno, &pPg, 1))!
f380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f390: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f3a0: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c     }.    pPg->fl
f3b0: 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
f3c0: 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
f3d0: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
f3e0: 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
f3f0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
f400: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
f410: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
f420: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
f430: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
f440: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
f450: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
f460: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
f470: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
f480: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
f490: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
f4a0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
f4b0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
f4c0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
f4d0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
f4e0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
f4f0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
f500: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
f510: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
f520: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
f530: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
f540: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
f550: 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
f560: 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
f570: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
f580: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f590: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
f5a0: 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
f5b0: 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
f5c0: 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74  l && (!isSavepnt
f5d0: 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50   || *pOffset<=pP
f5e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f5f0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
f600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
f610: 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20   this page were 
f620: 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72  just restored fr
f630: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20  om the main .   
f640: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
f650: 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e  le, then its con
f660: 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20  tent must be as 
f670: 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74  they were when t
f680: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  he .      ** tra
f690: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72  nsaction was fir
f6a0: 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  st opened. In th
f6b0: 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d  is case we can m
f6c0: 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20  ark the page.   
f6d0: 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20     ** as clean, 
f6e0: 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c  since there will
f6f0: 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77   be no need to w
f700: 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
f710: 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
f720: 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
f730: 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
f740: 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
f750: 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
f760: 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
f770: 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
f780: 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
f790: 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
f7a0: 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
f7b0: 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
f7c0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
f7d0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
f7e0: 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
f7f0: 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
f800: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f810: 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
f820: 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
f830: 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
f840: 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
f850: 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
f860: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
f870: 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
f880: 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
f890: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
f8a0: 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
f8b0: 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
f8c0: 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
f8d0: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f8e0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
f8f0: 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
f900: 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
f910: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
f920: 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
f930: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
f940: 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
f950: 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
f960: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
f970: 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
f980: 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
f990: 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
f9a0: 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
f9b0: 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
f9c0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
f9d0: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
f9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
f9f0: 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
fa00: 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
fa10: 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
fa20: 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
fa30: 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
fa40: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
fa50: 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
fa60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
fa70: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
fa80: 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
fa90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
faa0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
fab0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
fac0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
fad0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
fae0: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
faf0: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
fb00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
fb10: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
fb20: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
fb30: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
fb40: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
fb50: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
fb60: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
fb70: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
fb80: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
fb90: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
fba0: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
fbb0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
fbc0: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
fbd0: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
fbe0: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
fbf0: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
fc00: 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
fc10: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73  TE_NOMEM);.    s
fc20: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
fc30: 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
fc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc50: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
fc60: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
fc70: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
fc80: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
fc90: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
fca0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
fcb0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
fcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
fcd0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
fce0: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
fcf0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
fd00: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
fd10: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
fd20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fd30: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
fd40: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
fd50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
fd60: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
fd70: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
fd80: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
fd90: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
fda0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
fdb0: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
fdc0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
fdd0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
fde0: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
fdf0: 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
fe00: 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
fe10: 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
fe20: 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
fe30: 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
fe40: 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
fe50: 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
fe60: 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
fe70: 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
fe80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
fe90: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
fea0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
feb0: 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
fec0: 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
fed0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
fee0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
fef0: 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
ff00: 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
ff10: 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
ff20: 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
ff30: 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
ff40: 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
ff50: 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
ff60: 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
ff70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ff80: 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
ff90: 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
ffa0: 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
ffb0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
ffc0: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ffd0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
ffe0: 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
fff0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
10000 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10010 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
10020 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
10030 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
10040 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10050 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
10060 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
10070 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
10080 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
10090 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
100a0 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
100b0 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
100c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
100d0 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
100e0 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
100f0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
10100 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
10110 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
10120 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
10130 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
10140 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
10150 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
10160 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10170 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
10180 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
10190 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
101a0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
101b0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
101c0 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
101d0 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
101e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
101f0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
10200 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
10210 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
10220 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
10230 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
10240 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
10250 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
10260 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
10270 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
10280 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
10290 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
102a0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
102b0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
102c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
102d0 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
102e0 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
102f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
10300 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
10310 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
10320 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
10330 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
10340 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
10350 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10360 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
10370 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10380 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
10390 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
103a0 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
103b0 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
103c0 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
103d0 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
103e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
103f0 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
10400 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10410 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
10420 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10430 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
10440 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10460 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10470 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10480 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
10490 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
104a0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
104b0 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
104c0 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
104d0 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
104e0 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
104f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
10500 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
10510 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
10520 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
10530 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10540 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
10550 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
10560 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
10570 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
10580 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
10590 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
105a0 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
105b0 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
105c0 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
105d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
105e0 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
105f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10600 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
10610 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
10620 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
10630 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
10640 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
10650 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
10660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
10670 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
10680 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
10690 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
106a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
106b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
106c0 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
106d0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
106e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
106f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
10700 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
10710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
10720 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
10730 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
10740 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
10750 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10760 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10770 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  out;..  rc = sql
10780 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
10790 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
107a0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
107b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
107c0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
107d0 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
107e0 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
107f0 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
10800 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
10810 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
10820 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
10830 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
10840 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
10850 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
10860 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10870 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
10880 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
10890 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
108a0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
108b0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
108c0 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
108d0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
108e0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
108f0 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
10900 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
10910 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21   + 1);.    if( !
10920 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
10930 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10940 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10950 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10960 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
10970 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
10980 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
10990 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
109a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
109b0 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
109c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
109d0 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
109e0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  al, 0);.    if( 
109f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
10a00 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10a10 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a  ut;.    zMasterJ
10a20 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
10a30 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 20  urnal] = 0;..   
10a40 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
10a50 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
10a60 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
10a70 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
10a80 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
10a90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69  ){.      int exi
10aa0 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sts;.      rc = 
10ab0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
10ac0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
10ad0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
10ae0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
10af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b10 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
10b20 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
10b30 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20       if( exists 
10b40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
10b50 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
10b60 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
10b70 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10b80 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
10b90 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
10ba0 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
10bb0 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
10bc0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
10bd0 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
10be0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
10bf0 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
10c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
10c10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10c20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
10c30 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
10c40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
10c50 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
10c60 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
10c70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10c80 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
10c90 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
10ca0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
10cb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10cd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10ce0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
10cf0 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
10d00 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
10d10 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
10d20 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
10d30 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
10d40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
10d50 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
10d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
10d80 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
10d90 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
10da0 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
10db0 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
10dc0 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
10dd0 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
10de0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
10df0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
10e00 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
10e10 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
10e20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10e30 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
10e40 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10e50 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
10e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
10e70 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
10e80 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
10e90 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
10ea0 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
10eb0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
10ec0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
10ed0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
10ee0 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
10ef0 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
10f00 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
10f10 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
10f20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
10f30 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
10f40 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
10f50 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
10f60 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
10f70 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
10f80 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
10f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10fa0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10fb0 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
10fc0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
10fd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10fe0 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
10ff0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
11000 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
11010 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
11020 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
11030 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
11040 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
11050 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
11060 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
11070 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
11080 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
11090 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
110a0 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c  open, or an excl
110b0 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f  usive lock is no
110c0 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20  t.** held, this 
110d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
110e0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
110f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11100 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67  file is.** chang
11110 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
11120 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
11130 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
11140 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a  . If the file.**
11150 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
11160 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
11170 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
11180 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
11190 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
111a0 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
111b0 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
111c0 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62  it might might b
111d0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
111e0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
111f0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
11200 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
11210 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
11220 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
11230 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
11240 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
11250 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
11260 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
11270 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
11280 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
11290 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
112a0 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
112b0 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
112c0 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
112d0 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
112e0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
112f0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
11300 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
11310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
11320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
11330 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
11340 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
11350 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
11360 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
11370 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11390 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
113a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
113b0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
113c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
113d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
113e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
113f0 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28  USIVE && isOpen(
11400 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
11410 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
11420 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
11430 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
11440 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
11450 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
11460 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
11470 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11480 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
11490 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
114a0 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72  newSize = pPager
114b0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
114c0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
114d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
114e0 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
114f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
11500 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
11510 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
11520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11530 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
11540 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
11550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11570 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
11580 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a  d, "", 1, newSiz
11590 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e-1);.      }.  
115a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
115b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
115c0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
115d0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
115e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
115f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11600 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
11610 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
11620 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
11630 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
11640 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
11650 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
11660 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
11670 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
11680 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
11690 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
116a0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
116b0 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64  ill be used used
116c0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
116d0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
116e0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
116f0 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
11700 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11710 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
11720 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
11730 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
11740 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
11750 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
11760 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
11770 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
11780 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
11790 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
117a0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
117b0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
117c0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
117d0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
117e0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
117f0 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
11800 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
11810 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
11820 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
11830 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
11840 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
11850 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
11860 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
11870 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
11880 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
11890 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
118a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
118b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
118c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
118d0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
118e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
118f0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
11900 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
11910 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
11920 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
11930 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
11940 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
11950 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
11960 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
11970 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
11980 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
11990 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
119a0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
119b0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
119c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
119d0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
119e0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
119f0 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70  Size<32 ){.    p
11a00 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
11a10 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69  e = 512;.  }.  i
11a20 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
11a30 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
11a40 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
11a50 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
11a60 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
11a70 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
11a80 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  ize = MAX_SECTOR
11a90 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _SIZE;.  }.}../*
11aa0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
11ab0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
11ac0 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
11ad0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
11ae0 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
11af0 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
11b00 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
11b10 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
11b20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
11b30 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
11b40 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
11b50 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
11b60 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
11b70 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
11b80 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
11b90 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
11ba0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
11bb0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
11bc0 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
11bd0 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
11be0 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
11bf0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
11c00 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
11c10 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
11c20 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
11c30 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
11c40 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
11c50 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
11c60 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
11c70 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
11c80 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
11c90 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
11ca0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
11cb0 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
11cc0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
11cd0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
11ce0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
11cf0 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
11d00 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
11d10 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
11d20 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
11d30 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
11d40 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
11d50 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
11d60 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
11d70 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
11d80 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
11d90 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
11da0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
11db0 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
11dc0 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
11dd0 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
11de0 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
11df0 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
11e00 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
11e10 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
11e20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
11e30 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
11e40 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
11e50 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
11e60 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
11e70 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
11e80 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
11e90 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
11ea0 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
11eb0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
11ec0 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
11ed0 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
11ee0 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
11ef0 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
11f00 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
11f10 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
11f20 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
11f30 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
11f40 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
11f50 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
11f60 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
11f70 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
11f80 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
11f90 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
11fa0 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
11fb0 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
11fc0 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
11fd0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
11fe0 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
11ff0 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
12000 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
12010 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
12020 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
12030 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
12040 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
12050 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
12070 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
12080 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
12090 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
120a0 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
120b0 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
120c0 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
120d0 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
120e0 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
120f0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
12100 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
12110 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
12120 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
12130 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
12140 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
12150 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
12160 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
12170 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
12180 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
12190 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
121a0 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
121b0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
121c0 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
121d0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
121e0 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
121f0 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
12200 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
12210 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
12220 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
12230 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
12240 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
12250 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
12260 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12270 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
12280 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
12290 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
122a0 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
122b0 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
122c0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
122d0 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
122e0 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
122f0 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
12300 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
12310 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
12320 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
12330 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
12340 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
12350 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
12360 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
12370 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
12380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
12390 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
123a0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
123b0 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
123c0 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
123d0 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
123e0 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
123f0 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
12400 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
12410 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
12420 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
12430 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
12440 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
12450 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
12460 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
12470 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
12480 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
12490 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
124a0 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
124b0 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
124c0 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
124d0 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
124e0 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
124f0 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
12500 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
12510 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
12520 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
12530 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12540 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
12550 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
12560 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
12570 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
12580 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
12590 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
125a0 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
125b0 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
125c0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
125d0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
125e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
125f0 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
12600 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12610 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
12620 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
12630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12640 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
12650 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
12660 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12680 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
12690 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
126a0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
126d0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
126e0 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
126f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12700 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
12710 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
12720 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12740 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
12750 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12760 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
12770 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
12780 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
12790 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
127a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
127b0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
127c0 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
127d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
127e0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
127f0 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
12800 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
12810 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
12820 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
12830 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  back */..  /* Fi
12840 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
12850 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
12860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
12870 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
12880 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
12890 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
128a0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
128b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
128c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
128d0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
128e0 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
128f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12900 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
12910 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
12920 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
12930 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
12940 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
12950 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
12960 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
12970 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
12980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
12990 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
129a0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
129b0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
129c0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
129d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
129e0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
129f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
12a00 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
12a10 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
12a20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
12a30 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
12a40 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
12a50 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
12a60 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
12a70 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
12a80 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
12a90 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
12aa0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
12ab0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
12ac0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
12ad0 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
12ae0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
12af0 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20   **  mxPathname 
12b00 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
12b10 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
12b20 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
12b30 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
12b40 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
12b50 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
12b60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
12b70 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
12b80 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
12b90 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
12ba0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
12bb0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
12bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12bd0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
12be0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12bf0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
12c00 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
12c10 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
12c20 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
12c30 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
12c40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
12c50 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
12c60 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
12c70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
12c80 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
12c90 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
12ca0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
12cb0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
12cc0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
12cd0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
12ce0 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
12cf0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
12d00 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
12d10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
12d20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
12d30 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
12d40 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
12d50 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20 3d    int isUnsync =
12d60 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   0;..    /* Read
12d70 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
12d80 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
12d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
12da0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
12db0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
12dc0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
12dd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
12de0 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
12df0 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
12e00 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
12e10 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
12e20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
12e30 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
12e40 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
12e50 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
12e60 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
12e70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
12e80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
12e90 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
12ea0 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
12eb0 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
12ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12ed0 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
12ee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
12ef0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
12f00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12f10 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
12f20 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
12f30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12f40 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
12f50 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
12f60 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
12f70 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
12f80 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
12f90 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
12fa0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
12fb0 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
12fc0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
12fd0 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
12fe0 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
12ff0 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
13000 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
13010 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
13020 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
13030 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
13040 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
13050 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
13060 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
13070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13080 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
13090 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
130a0 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
130b0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
130c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
130d0 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
130e0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
130f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
13100 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
13110 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
13120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
13130 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
13140 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
13150 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
13160 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
13170 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
13180 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
13190 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
131a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
131b0 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
131c0 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
131d0 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
131e0 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
131f0 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
13200 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
13210 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
13220 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
13230 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
13240 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
13250 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
13260 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
13270 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
13280 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
13290 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
132a0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
132b0 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
132c0 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
132d0 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
132e0 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
132f0 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
13300 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
13310 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
13320 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
13330 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
13340 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
13350 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
13360 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
13370 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
13380 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
13390 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
133a0 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
133b0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
133c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
133d0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
133e0 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
133f0 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
13400 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
13410 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
13420 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
13430 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
13440 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
13450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13460 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
13470 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
13480 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
13490 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
134a0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
134b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
134c0 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
134d0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
134e0 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20  isUnsync = 1;.  
134f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
13500 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
13510 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
13520 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
13530 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
13540 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
13550 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
13560 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
13570 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
13580 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
13590 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
135a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
135b0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
135c0 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
135d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
135e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
135f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
13600 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
13610 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
13620 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
13630 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
13640 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
13650 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
13660 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
13670 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
13680 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
13690 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
136a0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
136b0 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
136c0 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
136d0 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
136e0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
136f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
13700 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
13710 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13720 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
13730 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
13740 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63  Pager,1,isUnsync
13750 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
13760 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20  lOff,0,0);.     
13770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
13790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
137a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
137b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
137c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
137d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
137e0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
137f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
13800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
13810 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
13820 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
13830 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
13840 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
13850 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
13860 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
13870 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
13880 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
13890 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
138a0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
138b0 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
138c0 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
138d0 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
138e0 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
138f0 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
13900 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
13910 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
13920 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13930 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
13940 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
13950 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13960 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
13970 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
13980 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
13990 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
139a0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
139b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
139c0 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
139d0 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
139e0 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
139f0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
13a00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
13a10 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
13a20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
13a30 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
13a40 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
13a50 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
13a60 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
13a70 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
13a80 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
13a90 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
13aa0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
13ab0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
13ac0 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
13ad0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
13ae0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
13af0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
13b00 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
13b10 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
13b20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
13b30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
13b40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
13b50 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
13b60 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
13b70 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
13b80 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
13b90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
13ba0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
13bb0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
13bc0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
13bd0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
13be0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
13bf0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
13c00 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
13c10 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
13c20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
13c30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
13c40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
13c50 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
13c60 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
13c70 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
13c80 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
13c90 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
13ca0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
13cb0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
13cc0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
13cd0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
13ce0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
13cf0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
13d00 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
13d10 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
13d20 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
13d30 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
13d40 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
13d50 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
13d60 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
13d70 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
13d80 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
13d90 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
13da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13db0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
13dc0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
13dd0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
13de0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
13df0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
13e00 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
13e10 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
13e20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
13e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13e40 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
13e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
13e60 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
13e70 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
13e80 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
13e90 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
13ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
13ec0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
13ed0 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
13ee0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
13ef0 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
13f00 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
13f10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
13f20 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
13f30 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
13f40 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
13f50 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
13f60 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
13f70 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
13f80 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
13f90 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
13fa0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
13fb0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
13fc0 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
13fd0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
13fe0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
13ff0 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
14000 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
14010 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
14020 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
14030 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
14040 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
14050 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
14060 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
14070 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
14080 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
14090 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
140a0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
140b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
140c0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
140d0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
140e0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
140f0 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
14100 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
14110 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
14120 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
14130 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
14140 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
14150 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
14160 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
14170 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
14180 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
14190 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
141a0 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
141b0 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
141c0 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
141d0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
141e0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
141f0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
14200 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
14210 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
14220 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
14230 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
14240 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
14250 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
14260 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
14270 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14280 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
14290 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
142a0 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
142b0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
142c0 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
142d0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
142e0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
142f0 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
14300 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
14310 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
14320 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
14330 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
14340 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
14350 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
14360 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
14370 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
14380 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
14390 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
143a0 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
143b0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
143c0 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
143d0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
143e0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
143f0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
14400 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
14410 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
14420 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
14430 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
14440 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
14450 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
14460 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
14470 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
14480 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
14490 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
144a0 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
144b0 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
144c0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
144d0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
144e0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
144f0 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
14500 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
14510 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
14520 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
14530 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
14540 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
14550 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
14560 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
14570 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
14580 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
14590 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
145a0 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
145b0 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
145c0 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
145d0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
145e0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
145f0 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
14600 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
14610 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
14620 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
14630 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
14640 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
14650 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
14660 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
14670 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
14680 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
14690 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
146a0 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
146b0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
146c0 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
146d0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
146e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
146f0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
14700 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
14710 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
14720 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
14730 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
14740 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
14750 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
14760 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
14770 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
14780 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
14790 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
147a0 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
147b0 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
147c0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
147d0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
147e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147f0 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
14800 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
14810 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
14820 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
14830 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
14840 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
14850 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
14860 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
14870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14880 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14890 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
148a0 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
148b0 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
148c0 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
148d0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
148e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
148f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
14900 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
14910 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
14920 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
14930 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
14940 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
14950 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
14960 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
14970 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
14980 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
14990 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
149a0 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
149b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
149c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
149d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
149e0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
149f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
14a00 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
14a10 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
14a20 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
14a30 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
14a40 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
14a50 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
14a60 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
14a70 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
14a80 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20  >dbOrigSize;..  
14a90 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
14aa0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
14ab0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
14ac0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
14ad0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
14ae0 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
14af0 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
14b00 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
14b10 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
14b20 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
14b30 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
14b40 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
14b50 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
14b60 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
14b70 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
14b80 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
14b90 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
14ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
14bb0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
14bc0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
14bd0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
14be0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
14bf0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
14c00 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
14c10 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
14c20 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
14c30 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
14c40 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
14c50 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
14c60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
14c70 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
14c80 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
14c90 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
14ca0 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
14cb0 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
14cc0 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
14cd0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
14ce0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
14cf0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
14d00 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
14d10 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
14d20 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
14d30 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
14d40 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
14d50 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
14d60 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
14d70 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
14d80 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
14d90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
14da0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
14db0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
14dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14de0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
14df0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
14e00 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
14e10 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26  (pPager, 1, 0, &
14e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14e30 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
14e40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
14e60 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
14e70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14e80 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
14e90 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
14ea0 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
14eb0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
14ec0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
14ed0 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
14ee0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
14ef0 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
14f00 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
14f10 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
14f20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
14f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
14f40 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
14f50 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
14f60 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
14f70 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
14f80 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
14f90 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
14fa0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
14fb0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
14fc0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
14fd0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
14fe0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14ff0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
15000 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
15010 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
15020 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
15030 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
15040 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
15050 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
15060 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
15070 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
15080 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15090 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
150a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
150b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
150c0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
150d0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
150e0 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
150f0 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
15100 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
15110 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
15120 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
15130 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
15140 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
15150 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
15160 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
15170 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
15180 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
15190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
151a0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
151b0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
151c0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
151d0 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
151e0 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
151f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
15200 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
15210 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
15220 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
15230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
15240 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
15250 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
15260 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
15270 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
15280 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
15290 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65  er, 1, 0, &pPage
152a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
152b0 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
152c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
152d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
152e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
152f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
15300 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15310 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  ==szJ );..  /* F
15320 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
15330 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
15340 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
15350 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
15360 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
15370 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
15380 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15390 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
153a0 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
153b0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
153c0 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
153d0 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
153e0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
153f0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
15400 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
15410 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15420 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
15430 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65  4 offset = pSave
15440 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
15450 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
15460 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  ze);.    for(ii=
15470 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
15480 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
15490 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
154a0 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
154b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
154c0 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61  ffset==ii*(4+pPa
154d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
154e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
154f0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15500 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20  page(pPager, 0, 
15510 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70  0, &offset, 1, p
15520 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15530 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15540 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15550 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
15560 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
15570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15580 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
15590 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
155a0 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  szJ;.  }.  retur
155b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
155c0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
155d0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
155e0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
155f0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
15600 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15610 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
15620 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
15630 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
15640 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
15650 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
15660 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
15670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
15680 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
15690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
156a0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
156b0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
156c0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
156d0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
156e0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
156f0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
15700 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
15710 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
15720 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
15730 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
15740 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
15750 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
15760 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
15770 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
15780 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
15790 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
157a0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
157b0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
157c0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
157d0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
157e0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
157f0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
15800 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
15810 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
15820 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
15830 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
15850 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
15860 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
15870 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
15880 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15890 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
158a0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
158b0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
158c0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
158d0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
158e0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
158f0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
15900 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
15920 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
15930 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
15940 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
15950 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
15960 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
15970 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
15980 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15990 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
159a0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
159b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
159c0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
159e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
159f0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
15a00 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
15a10 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
15a20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
15a30 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
15a40 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
15a50 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
15a60 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
15a70 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
15a80 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
15a90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15aa0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
15ab0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
15ac0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
15ad0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
15ae0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
15af0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
15b00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15b10 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
15b20 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
15b30 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
15b40 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
15b50 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
15b60 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
15b70 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
15b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
15b90 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
15ba0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
15bb0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
15bc0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
15bd0 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c  level, int bFull
15be0 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  Fsync){.  pPager
15bf0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
15c00 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
15c10 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
15c20 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
15c30 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
15c40 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
15c50 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
15c60 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
15c70 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
15c80 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
15c90 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
15ca0 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
15cb0 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
15cc0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
15cd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
15ce0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
15cf0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
15d00 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
15d10 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
15d20 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
15d30 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
15d40 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
15d50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
15d60 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
15d70 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
15d80 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
15d90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
15da0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
15db0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
15dc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
15dd0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
15de0 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
15df0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
15e00 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
15e10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
15e20 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
15e30 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
15e40 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
15e50 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
15e60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
15e70 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
15e80 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
15e90 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
15ea0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
15eb0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
15ec0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
15ed0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
15ee0 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
15ef0 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
15f00 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
15f10 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15f20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15f30 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
15f40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
15f50 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
15f60 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
15f70 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
15f80 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
15f90 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
15fa0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
15fb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15fd0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
15fe0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
15ff0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
16000 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
16010 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
16020 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
16030 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
16040 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
16050 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
16060 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16070 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
16080 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
16090 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
160a0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
160b0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
160c0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
160d0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
160e0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
160f0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
16100 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16120 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
16130 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
16140 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
16150 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
16160 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
16170 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
16180 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
16190 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
161a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
161b0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
161c0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
161d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
161e0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
161f0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
16200 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
16210 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
16220 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
16230 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
16240 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
16250 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
16260 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
16270 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
16280 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
16290 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
162a0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
162b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
162c0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
162d0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
162e0 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
162f0 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
16300 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
16310 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
16320 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
16330 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
16340 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
16350 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
16360 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
16370 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
16380 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
16390 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
163c0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16400 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
16410 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
16420 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
16430 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
16440 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
16450 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
16460 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
16470 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
16480 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
16490 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
164a0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
164b0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
164c0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
164d0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
164e0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
164f0 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
16500 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
16510 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
16520 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
16530 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
16540 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
16550 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
16560 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
16570 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
16580 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
16590 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
165a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
165b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
165c0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
165d0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
165e0 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
165f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16600 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
16610 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
16620 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
16630 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
16640 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
16650 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
16660 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20  andler */.){  . 
16670 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
16680 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
16690 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
166a0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
166b0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
166c0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  g;.}../*.** Repo
166d0 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
166e0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
166f0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
16700 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
16710 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
16720 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16730 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
16740 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
16750 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
16760 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
16770 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
16780 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
16790 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
167a0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
167b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
167e0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
167f0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
16800 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
16810 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
16820 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
16830 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
16840 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
16850 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16860 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
16870 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
16880 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
16890 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
168a0 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
168b0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
168c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
168d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
168e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
168f0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
16900 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
16910 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
16920 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
16930 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
16940 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
16950 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
16960 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53  ITE_CORRUPT or S
16970 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
16980 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
16990 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
169a0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
169b0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
169c0 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
169d0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
169e0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
169f0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
16a00 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
16a10 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
16a20 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
16a30 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
16a40 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
16a50 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
16a60 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
16a70 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
16a80 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
16a90 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
16aa0 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
16ab0 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
16ac0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
16ad0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
16ae0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
16af0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
16b00 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
16b10 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
16b20 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
16b30 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
16b40 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
16b50 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
16b60 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
16b70 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
16b80 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
16b90 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
16ba0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
16bb0 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
16bc0 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
16bd0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
16be0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
16bf0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
16c00 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
16c10 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
16c20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
16c30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16c40 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
16c50 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
16c60 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
16c70 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
16c80 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
16c90 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
16ca0 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
16cb0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
16cc0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
16cd0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
16ce0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
16cf0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
16d00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
16d10 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
16d20 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
16d30 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
16d40 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
16d50 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
16d60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
16d70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
16d80 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
16d90 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
16da0 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
16db0 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
16dc0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
16dd0 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  Code;..  if( rc=
16de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16df0 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
16e00 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
16e10 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
16e20 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
16e30 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
16e40 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
16e50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
16e60 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
16e70 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
16e80 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
16e90 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
16ea0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
16eb0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
16ec0 20 20 20 20 20 26 26 20 70 61 67 65 53 69 7a 65       && pageSize
16ed0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
16ee0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
16ef0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
16f00 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
16f10 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
16f20 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
16f30 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
16f40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
16f50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
16f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16f70 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
16f80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
16f90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
16fa0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
16fb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
16fc0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
16fd0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
16fe0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
16ff0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
17000 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
17010 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
17020 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
17030 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
17040 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53     }.    *pPageS
17050 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65  ize = (u16)pPage
17060 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
17070 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
17080 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
17090 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
170a0 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
170b0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
170c0 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
170d0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
170e0 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
170f0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
17100 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
17110 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17120 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17130 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17140 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
17150 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
17160 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
17170 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
17180 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
17190 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
171a0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
171b0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
171c0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
171d0 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
171e0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
171f0 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
17200 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
17210 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
17220 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
17230 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
17240 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
17250 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
17260 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
17270 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
17280 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
17290 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
172a0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
172b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
172c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
172d0 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
172e0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
172f0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
17300 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
17310 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
17320 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
17330 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
17340 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
17350 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
17360 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
17370 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
17380 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
17390 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
173a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
173b0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
173c0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
173d0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
173e0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
173f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17400 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
17410 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
17420 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
17430 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
17440 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
17450 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
17460 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
17470 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
17480 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  , 0);.  return p
17490 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
174a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
174b0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
174c0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
174d0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
174e0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
174f0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
17500 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
17510 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
17520 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
17530 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
17540 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
17550 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
17560 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
17570 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
17580 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
17590 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
175a0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
175b0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
175c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
175d0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
175e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
175f0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
17600 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
17610 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
17620 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
17630 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
17640 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
17650 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
17660 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
17670 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
17680 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
17690 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
176a0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
176b0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
176c0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
176d0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
176e0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
176f0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
17700 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
17710 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17720 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
17730 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17740 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
17750 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
17760 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
17770 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
17780 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
17790 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
177a0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
177b0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
177c0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
177d0 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
177e0 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
177f0 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
17800 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
17810 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
17820 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
17830 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
17840 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
17850 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
17860 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
17870 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
17880 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
17890 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
178a0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
178b0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
178c0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
178d0 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
178e0 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
178f0 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
17900 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
17910 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
17920 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
17930 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17940 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
17950 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
17960 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17970 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
17980 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
17990 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
179a0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
179b0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
179c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
179d0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
179e0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
179f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
17a00 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
17a10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
17a20 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
17a30 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
17a40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17a50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
17a60 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73  File );.  if( is
17a70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17a80 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
17a90 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
17aa0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
17ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17ac0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
17ad0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
17ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17af0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17b00 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
17b10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17b20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17b30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17b40 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
17b50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17b60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17b70 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
17b80 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
17b90 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
17ba0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
17bb0 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
17bc0 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
17bd0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
17be0 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
17bf0 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
17c00 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
17c10 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
17c20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
17c30 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
17c40 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17c50 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
17c60 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
17c70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
17c80 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
17c90 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
17ca0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
17cb0 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
17cc0 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
17cd0 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
17ce0 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
17cf0 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
17d00 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
17d10 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
17d20 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
17d30 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
17d40 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
17d50 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
17d60 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
17d70 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
17d80 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17d90 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
17da0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
17db0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17dc0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
17dd0 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
17de0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17df0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17e00 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
17e10 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17e20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17e30 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
17e40 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
17e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
17e60 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
17e70 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
17e80 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
17e90 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
17ea0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
17eb0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
17ec0 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  code. */.  if( p
17ed0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
17ee0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
17ef0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17f00 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
17f10 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
17f20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
17f30 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e  e. Store this in
17f40 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28   nPage. */.  if(
17f50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
17f60 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67  alid ){.    nPag
17f70 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
17f80 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
17f90 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
17fb0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  r returned by Os
17fc0 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20  FileSize() */.  
17fd0 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
17fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
17ff0 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
18000 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
18010 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20  leSize() */..   
18020 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
18030 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
18040 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18050 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
18060 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26  n(pPager->fd) &&
18070 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
18080 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
18090 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29  Pager->fd, &n)))
180a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
180b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
180c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
180d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
180e0 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
180f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
18100 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a       nPage = 1;.
18110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18120 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
18130 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65  n / pPager->page
18140 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
18150 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18160 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
18170 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18180 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
18190 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
181a0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
181b0 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
181c0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
181d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
181e0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
181f0 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
18200 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
18210 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
18220 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  e .  ** configur
18230 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
18240 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
18250 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
18260 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
18270 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
18280 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
18290 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
182a0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
182b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
182c0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
182d0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
182e0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
182f0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18300 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61  OK */.  if( pnPa
18310 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67  ge ){.    *pnPag
18320 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
18330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18340 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  K;.}.../*.** Try
18350 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
18360 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
18370 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
18380 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
18390 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
183a0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
183b0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
183c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
183d0 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
183e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
183f0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
18400 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
18410 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
18420 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
18430 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
18440 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
18450 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
18460 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
18470 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
18480 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
18490 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
184a0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
184b0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
184c0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
184d0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
184e0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
184f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18500 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
18510 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
18520 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
18530 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
18540 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
18550 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
18560 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
18570 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
18580 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
18590 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
185a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
185b0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
185c0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
185d0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
185e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18610 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
18620 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
18630 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
18640 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
18650 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
18660 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
18670 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
18680 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
18690 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
186a0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
186b0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
186c0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
186d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
186e0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
186f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
18700 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
18710 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
18720 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
18730 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18740 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
18750 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
18760 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  alid==0 );..  /*
18770 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
18780 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
18790 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
187a0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
187b0 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
187c0 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  held, or one of 
187d0 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73  the transistions
187e0 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
187f0 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
18800 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
18810 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
18820 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
18830 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
18840 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
18850 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
18860 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
18870 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  te>=locktype).  
18880 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
18890 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
188a0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
188b0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
188c0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
188d0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
188e0 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b  RESERVED && lock
188f0 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c  type==PAGER_EXCL
18900 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69  USIVE).  );..  i
18910 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18920 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
18930 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
18940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
18950 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
18960 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
18970 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
18980 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
18990 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
189a0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
189b0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
189c0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
189d0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
189e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
189f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
18a00 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
18a10 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
18a20 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
18a30 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
18a40 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
18a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18a60 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
18a70 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
18a80 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
18a90 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
18aa0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
18ab0 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
18ac0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
18ad0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
18ae0 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
18af0 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
18b00 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
18b10 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
18b20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
18b30 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
18b40 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
18b50 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
18b60 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
18b70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
18b80 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
18b90 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
18ba0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
18bb0 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
18bc0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
18bd0 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
18be0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
18bf0 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
18c00 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
18c10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
18c20 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
18c30 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
18c40 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
18c50 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
18c60 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
18c70 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
18c80 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
18c90 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
18ca0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
18cb0 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
18cc0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
18cd0 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
18ce0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
18cf0 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
18d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18d10 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
18d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
18d30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
18d40 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
18d50 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
18d60 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
18d70 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
18d80 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
18d90 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
18da0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
18db0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
18dc0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
18dd0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
18de0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
18df0 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
18e00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
18e10 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
18e20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
18e30 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
18e40 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
18e50 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
18e60 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
18e70 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
18e80 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
18e90 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
18ea0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
18eb0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
18ec0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
18ed0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
18ee0 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
18ef0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
18f00 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
18f10 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
18f20 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
18f30 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
18f40 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
18f50 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
18f60 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
18f70 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
18f80 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
18f90 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
18fa0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
18fb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
18fc0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
18fd0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
18fe0 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
18ff0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
19000 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
19010 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
19020 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
19030 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
19040 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
19050 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
19060 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
19070 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
19080 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
19090 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
190a0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
190b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
190c0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
190d0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
190e0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
190f0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
19100 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
19110 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
19120 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
19130 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
19140 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
19150 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19160 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
19170 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
19180 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
191a0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
191b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
191c0 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
191d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
191e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
191f0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
19200 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19210 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
19220 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
19230 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  nt(pPager);.}../
19240 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
19250 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
19260 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
19270 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
19280 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
19290 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
192a0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
192b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
192c0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
192d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
192e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
192f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
19300 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
19310 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
19320 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
19330 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
19340 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
19350 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
19360 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
19370 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
19380 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
19390 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
193a0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
193b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
193c0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
193d0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
193e0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
193f0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
19400 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
19410 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
19420 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
19430 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
19440 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
19450 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
19460 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
19470 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
19480 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
19490 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
194a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
194b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
194c0 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  {.  disable_simu
194d0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
194e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
194f0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
19500 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
19510 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
19520 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
19530 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
19540 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
19550 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
19560 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
19570 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
19580 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a    /* Set Pager.j
19590 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20  ournalHdr to -1 
195a0 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20  for the benefit 
195b0 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  of the pager_pla
195c0 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20  yback() .    ** 
195d0 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62  call which may b
195e0 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68  e made from with
195f0 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  in pagerUnlockAn
19600 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20  dRollback(). If 
19610 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
19620 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e   -1, then the un
19630 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
19640 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  f an open journa
19650 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a  l file may.    *
19660 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  * be played back
19670 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
19680 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
19690 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
196a0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
196b0 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
196c0 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
196d0 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
196e0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
196f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d  ->journalHdr = -
19700 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  1;.    pagerUnlo
19710 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
19720 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
19730 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
19740 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
19750 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
19760 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
19770 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
19780 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19790 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
197a0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
197b0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
197c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
197d0 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
197e0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
197f0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
19800 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
19810 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
19820 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
19830 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
19840 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
19850 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
19860 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
19870 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
19880 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
19890 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
198a0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
198b0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
198c0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
198d0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
198e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
198f0 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
19900 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
19910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19920 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
19930 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
19940 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
19950 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
19960 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
19970 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
19980 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
19990 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
199a0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
199b0 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
199c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
199d0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
199e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
199f0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
19a00 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
19a10 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
19a20 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19a30 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
19a40 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
19a50 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
19a60 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
19a70 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
19a80 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
19a90 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
19aa0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
19ab0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
19ac0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
19ad0 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
19ae0 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
19af0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
19b00 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
19b10 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
19b20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
19b30 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  lag is not set, 
19b40 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
19b50 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  on is a.** no-op
19b60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
19b70 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
19b80 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
19b90 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20  journal-mode.** 
19ba0 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63  and the device c
19bb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
19bc0 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
19bd0 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
19be0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
19bf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19c00 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
19c10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
19c20 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
19c30 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
19c40 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
19c50 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
19c60 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
19c70 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
19c80 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
19c90 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
19ca0 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
19cb0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
19cc0 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
19cd0 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
19ce0 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
19cf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
19d00 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
19d10 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
19d20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
19d30 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
19d40 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
19d50 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
19d60 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
19d70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
19d80 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
19d90 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
19da0 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
19db0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
19dc0 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
19dd0 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
19de0 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
19df0 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
19e00 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
19e10 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
19e20 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
19e30 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
19e40 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
19e50 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
19e60 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
19e70 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
19e80 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
19e90 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
19ea0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
19eb0 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
19ec0 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
19ed0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
19ee0 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
19ef0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
19f00 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
19f10 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   The Pager.needS
19f20 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65  ync flag is neve
19f30 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d  r be set for tem
19f40 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  porary files, or
19f50 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   any.** file ope
19f60 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  rating in no-syn
19f70 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f  c mode (Pager.no
19f80 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d  Sync set to non-
19f90 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  zero)..**.** If 
19fa0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
19fb0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
19fc0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
19fd0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
19fe0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
19ff0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
1a000 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
1a010 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
1a020 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
1a030 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1a040 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1a050 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1a060 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1a070 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a080 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
1a090 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a0a0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
1a0b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
1a0c0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1a0d0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1a0e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a0f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1a100 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1a110 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20  {.      int rc; 
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a140 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1a150 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
1a160 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1a170 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a180 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1a190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1a1a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1a1b0 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
1a1c0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1a1d0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1a1e0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1a1f0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1a200 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1a210 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1a220 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1a230 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1a240 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1a250 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1a260 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1a270 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1a280 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1a290 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1a2a0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1a2b0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1a2c0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1a2d0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1a2e0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1a2f0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1a300 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1a310 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1a320 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1a330 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1a340 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1a350 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1a360 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1a370 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63  nections transac
1a380 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
1a390 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
1a3a0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
1a3b0 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
1a3c0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
1a3d0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
1a3e0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
1a3f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
1a400 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
1a410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
1a420 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
1a430 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
1a440 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
1a450 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
1a460 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
1a470 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
1a480 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
1a490 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1a4a0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
1a4b0 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
1a4c0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
1a4d0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
1a4e0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
1a4f0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
1a500 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
1a510 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
1a520 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
1a530 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
1a540 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
1a550 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
1a560 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
1a570 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
1a580 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
1a590 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
1a5a0 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
1a5b0 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
1a5c0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
1a5d0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
1a5e0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
1a5f0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
1a600 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
1a610 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
1a620 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
1a630 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
1a640 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1a650 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
1a660 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
1a670 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
1a680 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
1a690 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
1a6a0 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
1a6b0 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
1a6c0 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
1a6d0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
1a6e0 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
1a6f0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
1a700 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
1a710 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
1a720 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
1a730 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
1a740 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
1a750 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
1a760 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
1a770 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
1a780 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65  c[8];..u8 zHeade
1a790 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
1a7a0 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65  lMagic)+4];...me
1a7b0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1a7c0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1a7d0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1a7e0 63 29 29 3b 0a 09 70 75 74 33 32 62 69 74 73 28  c));..put32bits(
1a7f0 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
1a800 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
1a810 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
1a820 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
1a830 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
1a840 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
1a850 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
1a860 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1a870 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
1a880 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
1a890 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
1a8a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a8b0 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
1a8c0 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
1a8d0 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
1a8e0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1a8f0 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
1a900 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
1a910 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1a920 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1a930 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
1a940 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1a950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a970 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1a980 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1a990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1a9a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1a9b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
1a9c0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
1a9d0 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
1a9e0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
1a9f0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
1aa00 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
1aa10 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
1aa20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
1aa30 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
1aa40 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
1aa50 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
1aa60 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
1aa70 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
1aa80 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
1aa90 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
1aaa0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
1aab0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
1aac0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1aad0 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1aae0 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
1aaf0 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
1ab00 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
1ab10 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
1ab20 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
1ab30 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
1ab40 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
1ab50 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
1ab60 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
1ab70 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
1ab80 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
1ab90 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
1aba0 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
1abb0 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
1abc0 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
1abd0 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
1abe0 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
1abf0 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
1ac00 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
1ac10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ac20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
1ac30 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
1ac40 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1ac50 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1ac60 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1ac70 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
1ac80 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
1ac90 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
1aca0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1acb0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1acc0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1acd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ace0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1acf0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1ad00 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
1ad10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ad20 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ad30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ad40 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
1ad50 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
1ad60 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
1ad70 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
1ad80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ad90 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
1ada0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
1adb0 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
1adc0 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
1add0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
1ade0 09 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .);.        if( 
1adf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ae00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ae10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
1ae20 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1ae30 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
1ae40 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1ae50 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
1ae60 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
1ae70 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
1ae80 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1ae90 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
1aea0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
1aeb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1aec0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1aed0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1aee0 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
1aef0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1af00 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
1af10 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
1af20 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
1af30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1af40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1af50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1af60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1af70 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
1af80 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73   file was just s
1af90 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63  uccessfully sync
1afa0 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65  ed. Set Pager.ne
1afb0 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74  edSync .    ** t
1afc0 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72  o zero and clear
1afd0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1afe0 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c  SYNC flag on all
1aff0 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a   pagess..    */.
1b000 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
1b010 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
1b020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1b030 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  rted = 1;.    sq
1b040 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
1b050 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
1b060 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
1b070 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b080 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1b090 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1b0a0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
1b0b0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
1b0c0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
1b0d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
1b0e0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
1b0f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1b100 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
1b110 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
1b120 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
1b130 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
1b140 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1b150 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
1b160 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
1b170 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
1b180 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
1b190 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1b1a0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
1b1b0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
1b1c0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
1b1d0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
1b1e0 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
1b1f0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
1b200 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
1b210 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
1b220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1b230 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
1b240 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
1b250 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1b260 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
1b270 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
1b280 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
1b290 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
1b2a0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
1b2b0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1b2c0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
1b2d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
1b2e0 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
1b2f0 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
1b300 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
1b310 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
1b320 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
1b330 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
1b340 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
1b350 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
1b360 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
1b370 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
1b380 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
1b390 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
1b3a0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
1b3b0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
1b3c0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
1b3d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
1b3e0 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
1b3f0 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
1b400 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
1b410 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
1b420 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
1b430 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
1b440 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1b450 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1b460 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1b470 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
1b480 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
1b490 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
1b4a0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
1b4b0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
1b4c0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
1b4d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1b4e0 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
1b4f0 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
1b500 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
1b510 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
1b520 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
1b530 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
1b540 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
1b550 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
1b560 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
1b570 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
1b580 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
1b590 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1b5a0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
1b5b0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1b5c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1b5d0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1b5e0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1b5f0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
1b600 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1b610 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
1b620 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
1b630 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
1b640 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b650 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1b660 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
1b670 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
1b680 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
1b690 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1b6c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ct */.  int rc; 
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b6f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1b700 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73    if( NEVER(pLis
1b710 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53  t==0) ) return S
1b720 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
1b730 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
1b740 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
1b750 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
1b760 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
1b770 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
1b780 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
1b790 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b7a0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
1b7b0 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
1b7c0 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
1b7d0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
1b7e0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
1b7f0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
1b800 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
1b810 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
1b820 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
1b830 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
1b840 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
1b850 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
1b860 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
1b870 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
1b880 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
1b890 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
1b8a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1b8b0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
1b8c0 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
1b8d0 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
1b8e0 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
1b8f0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
1b900 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
1b910 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
1b920 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
1b930 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
1b940 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
1b950 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
1b960 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
1b970 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
1b980 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
1b990 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1b9a0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
1b9b0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
1b9c0 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
1b9d0 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
1b9e0 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
1b9f0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
1ba00 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1ba10 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
1ba20 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
1ba30 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
1ba40 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1ba50 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
1ba60 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
1ba70 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
1ba80 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
1ba90 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
1baa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1bab0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1bac0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1bad0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1bae0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1baf0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1bb00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
1bb10 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
1bb20 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
1bb30 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
1bb40 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
1bb50 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1bb60 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
1bb70 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1bb80 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
1bb90 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
1bba0 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
1bbb0 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
1bbc0 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
1bbd0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
1bbe0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1bbf0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
1bc00 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1bc10 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
1bc20 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
1bc30 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
1bc40 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
1bc50 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
1bc60 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  gs);.  }..  whil
1bc70 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1bc80 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
1bc90 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
1bca0 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
1bcb0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1bcc0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
1bcd0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
1bce0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1bcf0 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
1bd00 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1bd10 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
1bd20 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1bd30 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
1bd40 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1bd50 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1bd60 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1bd70 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1bd80 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1bd90 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1bda0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1bdb0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1bdc0 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
1bdd0 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
1bde0 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
1bdf0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1be00 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
1be10 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
1be20 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
1be30 29 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 69 66  ).  Note that if
1be40 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20   compiled with. 
1be50 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53 45 43     ** SQLITE_SEC
1be60 55 52 45 5f 44 45 4c 45 54 45 20 74 68 65 20 50  URE_DELETE the P
1be70 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1be80 62 69 74 20 69 73 20 6e 65 76 65 72 20 73 65 74  bit is never set
1be90 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 74   and so.    ** t
1bea0 68 65 20 73 65 63 6f 6e 64 20 74 65 73 74 20 69  he second test i
1beb0 73 20 61 6c 77 61 79 73 20 74 72 75 65 2e 0a 20  s always true.. 
1bec0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
1bed0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
1bee0 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
1bef0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
1bf00 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
1bf10 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
1bf20 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1bf30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
1bf40 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
1bf50 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
1bf60 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1bf90 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
1bfa0 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e     ..      /* En
1bfb0 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
1bfc0 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
1bfd0 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
1bfe0 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
1bff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c000 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
1c010 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
1c020 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
1c030 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1c040 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1c050 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
1c060 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c070 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
1c080 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
1c090 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
1c0a0 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
1c0b0 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
1c0c0 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
1c0d0 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
1c0e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c0f0 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
1c100 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
1c110 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
1c120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1c130 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
1c140 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
1c150 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1c160 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
1c170 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1c180 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
1c190 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
1c1a0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c1b0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
1c1c0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1c1d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c1f0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1c200 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
1c210 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1c220 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
1c230 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
1c240 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
1c250 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
1c260 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1c270 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1c280 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
1c290 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
1c2a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c2b0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
1c2c0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1c2d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c2e0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1c2f0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1c300 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1c310 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
1c320 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
1c330 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c340 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
1c350 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1c360 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
1c370 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
1c380 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
1c390 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
1c3a0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1c3b0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
1c3c0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c3d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c3e0 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  o));.    }.#ifde
1c3f0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c400 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
1c410 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1c420 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c430 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
1c440 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
1c450 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
1c460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1c470 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
1c480 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
1c490 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
1c4a0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c4b0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
1c4c0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
1c4d0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
1c4e0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1c4f0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
1c500 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
1c510 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
1c520 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1c530 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1c540 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
1c550 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
1c560 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
1c570 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
1c580 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
1c590 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
1c5a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1c5b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1c5c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
1c5d0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1c5e0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1c5f0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
1c600 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
1c610 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1c620 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c630 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
1c640 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
1c650 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
1c660 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
1c670 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
1c680 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
1c690 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
1c6a0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
1c6b0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
1c6c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c6d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1c6e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1c6f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1c700 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76  ->sjfd) ){.    v
1c710 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
1c720 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34  ->pData;.    i64
1c730 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1c740 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
1c750 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c760 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1c770 3b 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50  ;..    CODEC2(pP
1c780 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1c790 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
1c7a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c7b0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47  pData2);.    PAG
1c7c0 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
1c7d0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1c7e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c7f0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1c800 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72  ));.  .    asser
1c810 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1c820 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
1c830 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1c840 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  gSize );.    rc 
1c850 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1c860 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
1c870 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
1c880 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c890 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c8a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c8b0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
1c8c0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c8d0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c8e0 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+4);.    }.  }.
1c8f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c900 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1c910 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
1c920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c930 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1c940 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
1c950 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1c960 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1c970 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1c980 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c990 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c9a0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1c9b0 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
1c9c0 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
1c9d0 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
1c9e0 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
1c9f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1ca00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1ca10 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
1ca20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
1ca30 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
1ca40 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
1ca50 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
1ca60 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
1ca70 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
1ca80 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
1ca90 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
1caa0 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
1cab0 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
1cac0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1cad0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
1cae0 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
1caf0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
1cb00 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
1cb10 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
1cb20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
1cb30 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
1cb40 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
1cb50 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
1cb60 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
1cb70 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
1cb80 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
1cb90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1cba0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
1cbb0 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
1cbc0 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
1cbd0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
1cbe0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cbf0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
1cc00 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
1cc10 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
1cc20 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1cc30 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
1cc40 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1cc50 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
1cc60 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
1cc70 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
1cc80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1cc90 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
1cca0 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
1ccb0 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
1ccc0 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
1ccd0 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
1cce0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
1ccf0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1cd00 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1cd10 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1cd20 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
1cd30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cd40 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
1cd50 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
1cd60 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1cd70 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
1cd80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cd90 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1cda0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
1cdb0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
1cdc0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1cdd0 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
1cde0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  * The doNotSync 
1cdf0 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
1ce00 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  he sqlite3PagerW
1ce10 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  rite() function 
1ce20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73  while it.  ** is
1ce30 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
1ce40 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
1ce50 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
1ce60 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
1ce70 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  .  ** on the sam
1ce80 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
1ce90 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  yncing the journ
1cea0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  al is not allowe
1ceb0 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69  d while.  ** thi
1cec0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  s is happening a
1ced0 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
1cee0 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65  t that all membe
1cef0 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a  rs of such a.  *
1cf00 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61  * set of pages a
1cf10 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
1cf20 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20  k together. So, 
1cf30 69 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73  if the page this
1cf40 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
1cf50 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  s trying to make
1cf60 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75   clean will requ
1cf70 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ire a journal sy
1cf80 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74  nc and the doNot
1cf90 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69  Sync.  ** flag i
1cfa0 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1cfb0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1cfc0 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1cfd0 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a   layer will.  **
1cfe0 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f   just have to go
1cff0 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63   ahead and alloc
1d000 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62  ate a new page b
1d010 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66  uffer instead of
1d020 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50  .  ** reusing pP
1d030 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d  g..  **.  ** Sim
1d040 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70  ilarly, if the p
1d050 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
1d060 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
1d070 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1d080 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69  .  ** try to wri
1d090 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1d0a0 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a  of pPg to disk..
1d0b0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
1d0c0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
1d0d0 29 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  ).   || (pPager-
1d0e0 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d0f0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d100 45 45 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20  EED_SYNC).  ){. 
1d110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d120 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
1d130 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1d140 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
1d150 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  . */.  if( pPg->
1d160 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d170 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20  _SYNC ){.    rc 
1d180 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d190 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1d1a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d1b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1d1c0 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61   && .      !(pPa
1d1d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1d1e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1d1f0 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
1d200 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
1d210 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1d220 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1d230 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
1d240 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
1d250 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d260 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1d270 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1d280 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1d290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1d2a0 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
1d2b0 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
1d2c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1d2d0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d2e0 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1d2f0 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
1d300 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
1d310 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
1d320 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68  journal..  ** Th
1d330 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
1d340 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
1d350 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
1d360 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
1d370 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
1d380 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
1d390 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1d3a0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  e..  **.  ** Con
1d3b0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1d3c0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
1d3d0 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a  events:.  **.  *
1d3e0 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
1d3f0 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
1d400 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d  e X>.  **     <m
1d410 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
1d420 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
1d430 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20   sp;.  **       
1d440 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
1d450 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
1d460 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67  >.  **       pag
1d470 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
1d480 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
1d490 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20  CK TO sp;.  **. 
1d4a0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1d4b0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1d4c0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1d4d0 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1d4e0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75   written.  ** ou
1d4f0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1d500 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
1d510 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
1d520 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
1d530 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ,.  ** following
1d540 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1d550 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
1d560 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
1d570 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64  will read.  ** d
1d580 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
1d590 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
1d5a0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
1d5b0 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
1d5c0 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20  t.  ** was when 
1d5d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d5e0 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
1d5f0 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
1d600 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20  EPOINT sp".  ** 
1d610 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
1d620 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  **.  ** The solu
1d630 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
1d640 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
1d650 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
1d660 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
1d670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1d680 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1d690 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1d6a0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1d6b0 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
1d6c0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
1d6d0 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
1d6e0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
1d6f0 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64  s .  ** executed
1d700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
1d710 45 52 28 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ER(.      rc==SQ
1d720 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
1d730 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
1d740 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
1d750 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 29  resPage(pPg).  )
1d760 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62   ){.    rc = sub
1d770 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
1d780 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1d790 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d7a0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
1d7b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d7c0 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ile. */.  if( rc
1d7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d7e0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1d7f0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1d800 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1d810 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
1d820 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1d830 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
1d840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d850 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
1d860 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
1d870 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1d880 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d890 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
1d8a0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d8b0 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
1d8c0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d8d0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d8e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
1d8f0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1d900 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
1d910 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
1d920 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
1d930 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
1d940 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
1d950 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
1d960 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
1d970 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d980 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
1d990 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1d9a0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1d9b0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
1d9c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1d9d0 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
1d9e0 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
1d9f0 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
1da00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1da10 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
1da20 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
1da30 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
1da40 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
1da50 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
1da60 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1da70 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
1da80 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
1da90 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
1daa0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
1dab0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
1dac0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
1dad0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1dae0 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
1daf0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1db00 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
1db10 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1db20 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
1db30 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
1db40 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
1db50 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1db60 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
1db70 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
1db80 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
1db90 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
1dba0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
1dbb0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
1dbc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1dbd0 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
1dbe0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
1dbf0 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
1dc00 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
1dc10 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
1dc20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
1dc30 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
1dc40 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
1dc50 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
1dc60 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
1dc70 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
1dc80 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
1dc90 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
1dca0 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
1dcb0 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
1dcc0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
1dcd0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
1dce0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
1dcf0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
1dd00 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
1dd10 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
1dd20 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
1dd30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1dd40 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
1dd50 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
1dd60 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
1dd70 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
1dd80 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
1dd90 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1dda0 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
1ddb0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
1ddc0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
1ddd0 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
1dde0 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
1ddf0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1de00 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
1de10 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1de20 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
1de30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1de40 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
1de50 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
1de60 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1de70 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
1de80 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
1de90 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
1dea0 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
1deb0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
1dec0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1ded0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
1dee0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
1def0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
1df00 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
1df10 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
1df20 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
1df30 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
1df40 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1df50 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1df60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1df70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1df80 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1df90 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
1dfa0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
1dfb0 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
1dfc0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1dfd0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1dfe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dff0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
1e000 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
1e010 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1e020 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1e030 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
1e040 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
1e050 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
1e060 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
1e070 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
1e080 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
1e090 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
1e0a0 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
1e0b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e0c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
1e0d0 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
1e0e0 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
1e0f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e100 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
1e110 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e120 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
1e130 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e140 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
1e150 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
1e160 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
1e170 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
1e180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e190 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
1e1a0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1e1b0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
1e1c0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e1d0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e1e0 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
1e1f0 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
1e200 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
1e210 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e220 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
1e230 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
1e240 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
1e250 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1e260 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e270 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
1e280 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
1e290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e2a0 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
1e2b0 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
1e2c0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
1e2d0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1e2e0 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
1e2f0 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
1e300 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
1e310 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
1e320 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1e330 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
1e340 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
1e350 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
1e360 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
1e370 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
1e380 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e390 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
1e3a0 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
1e3b0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
1e3c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1e3d0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
1e3e0 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
1e3f0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1e400 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1e410 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
1e420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1e430 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
1e440 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
1e450 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e460 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
1e470 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
1e480 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
1e490 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1e4a0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1e4b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1e4c0 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
1e4d0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
1e4e0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
1e4f0 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
1e500 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
1e510 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
1e520 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
1e530 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
1e540 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
1e550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
1e560 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
1e570 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e580 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1e590 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
1e5a0 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
1e5b0 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
1e5c0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1e5d0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e5e0 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
1e5f0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
1e600 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e610 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e620 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e630 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
1e640 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e650 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e660 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e670 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
1e680 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1e690 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
1e6a0 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
1e6b0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
1e6c0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
1e6d0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
1e6e0 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
1e6f0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
1e700 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
1e710 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
1e720 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
1e730 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
1e740 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
1e750 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
1e760 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
1e770 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
1e780 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
1e790 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1e7a0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1e7b0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
1e7c0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
1e7d0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
1e7e0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
1e7f0 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
1e800 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
1e810 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
1e820 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e830 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e850 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
1e860 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
1e870 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
1e880 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
1e890 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
1e8a0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1e8b0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1e8c0 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
1e8d0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1e8e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
1e8f0 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
1e900 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
1e910 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1e920 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
1e930 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
1e940 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
1e950 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
1e960 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
1e970 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1e980 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
1e990 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e9a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1e9b0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
1e9c0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
1e9d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
1e9e0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
1e9f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
1ea00 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
1ea10 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1ea20 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
1ea30 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
1ea40 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
1ea50 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
1ea60 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
1ea70 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
1ea80 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
1ea90 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
1eaa0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
1eab0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1eac0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1ead0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
1eae0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
1eaf0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
1eb00 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
1eb10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1eb20 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1eb30 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EN;.    }.    if
1eb40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eb50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1eb60 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1eb70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1eb80 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1eb90 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
1eba0 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
1ebb0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
1ebc0 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
1ebd0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
1ebe0 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
1ebf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
1ec00 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
1ec10 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
1ec20 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
1ec30 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
1ec40 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1ec50 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
1ec60 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ec70 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
1ec80 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
1ec90 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
1eca0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ecb0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
1ecc0 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
1ecd0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1ece0 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
1ecf0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
1ed00 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
1ed10 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
1ed20 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1ed30 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
1ed40 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1ed50 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
1ed60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1ed70 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
1ed80 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
1ed90 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1eda0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1edc0 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
1edd0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
1ede0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1edf0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1ee00 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
1ee10 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
1ee20 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1ee30 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
1ee40 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1ee50 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
1ee60 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
1ee70 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
1ee80 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
1ee90 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
1eea0 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
1eeb0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1eec0 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
1eed0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
1eee0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1eef0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
1ef00 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
1ef10 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
1ef20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1ef30 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
1ef40 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1ef50 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
1ef60 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
1ef70 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
1ef80 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65  l */.  );.  asse
1ef90 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1efa0 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
1efb0 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
1efc0 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
1efd0 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1efe0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1eff0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1f000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f010 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1f020 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1f030 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1f040 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1f050 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1f060 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f070 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f080 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
1f090 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
1f0a0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f0b0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
1f0c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1f0d0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1f0e0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f0f0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
1f100 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
1f110 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
1f120 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
1f130 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f140 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f150 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
1f160 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f170 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
1f180 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f190 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
1f1a0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
1f1b0 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
1f1c0 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
1f1d0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
1f1e0 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
1f1f0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
1f200 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50  thname ){.    pP
1f210 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
1f220 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f230 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
1f240 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f250 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f260 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f270 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f280 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
1f290 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
1f2a0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
1f2b0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1f2c0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
1f2d0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
1f2e0 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   8);.    if( pPa
1f2f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
1f300 5d 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a  ]==0 ) pPager->z
1f310 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a  Journal[0] = 0;.
1f320 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f330 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  (zPathname);.  }
1f340 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
1f350 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
1f360 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
1f370 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
1f380 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1f390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
1f3a0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
1f3b0 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62  ame[0] && !memDb
1f3c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
1f3d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
1f3f0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
1f400 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
1f410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1f420 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
1f430 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
1f440 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
1f450 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72  s, &fout);.    r
1f460 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
1f470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f480 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
1f490 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
1f4a0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
1f4b0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
1f4c0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
1f4d0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
1f4e0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
1f4f0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
1f500 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
1f510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f520 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
1f530 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
1f540 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
1f550 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
1f560 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f570 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
1f580 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
1f590 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1f5a0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1f5b0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
1f5c0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
1f5d0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
1f5e0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
1f5f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1f600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f610 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
1f620 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
1f630 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f640 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
1f650 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
1f660 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1f670 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
1f680 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
1f690 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
1f6a0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
1f6b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1f6c0 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
1f6d0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
1f6e0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
1f6f0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f700 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
1f710 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
1f720 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f730 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1f740 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  lt = (u16)pPager
1f750 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
1f760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f780 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1f790 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
1f7a0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
1f7b0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1f7c0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1f7d0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
1f7e0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
1f7f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1f800 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
1f810 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
1f820 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f830 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
1f840 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
1f850 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1f860 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f870 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
1f880 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
1f890 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
1f8a0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
1f8b0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1f8c0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
1f8d0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
1f8e0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f8f0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
1f900 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f910 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
1f920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1f930 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f940 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1f950 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
1f960 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
1f970 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
1f980 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
1f990 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
1f9a0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
1f9b0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
1f9c0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
1f9d0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
1f9e0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
1f9f0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
1fa00 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
1fa10 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
1fa20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
1fa30 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
1fa40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1fa50 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
1fa60 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
1fa70 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
1fa80 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
1fa90 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
1faa0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
1fab0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
1fac0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
1fad0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fae0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
1faf0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
1fb00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1fb10 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1fb20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1fb30 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
1fb40 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
1fb50 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1fb60 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
1fb70 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fb80 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
1fb90 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
1fba0 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
1fbb0 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
1fbc0 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
1fbd0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
1fbe0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1fbf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1fc00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
1fc10 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
1fc20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fc30 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
1fc40 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
1fc50 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
1fc60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1fc70 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
1fc80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fc90 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
1fca0 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
1fcb0 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a  e, free the .  *
1fcc0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
1fcd0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
1fce0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
1fcf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fd00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1fd10 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1fd20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
1fd30 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1fd40 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
1fd50 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
1fd60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fd70 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
1fd80 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
1fd90 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ect. */.  assert
1fda0 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  ( nExtra<1000 );
1fdb0 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e  .  nExtra = ROUN
1fdc0 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71  D8(nExtra);.  sq
1fdd0 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
1fde0 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
1fdf0 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
1fe20 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
1fe30 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
1fe40 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52  Cache);..  PAGER
1fe50 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
1fe60 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
1fe70 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
1fe80 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1fe90 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
1fea0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
1feb0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
1fec0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
1fed0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1fee0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
1fef0 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nal;.  pPager->n
1ff00 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52  oReadlock = (noR
1ff10 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
1ff20 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20  nly) ?1:0;.  /* 
1ff30 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1ff40 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
1ff50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ff60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
1ff70 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
1ff80 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1ff90 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65  zeValid = (u8)me
1ffa0 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  mDb;.  /* pPager
1ffb0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
1ffc0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1ffd0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
1ffe0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
1fff0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
20000 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
20010 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
20020 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
20030 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
20040 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
20050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20060 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
20070 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
20080 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
20090 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
200a0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
200b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
200c0 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
200d0 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
200e0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
200f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
20100 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
20110 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
20120 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
20130 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
20140 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
20150 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
20160 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
20170 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
20180 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
20190 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
201a0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
201b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
201c0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
201d0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
201e0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
201f0 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
20200 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
20210 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73  ync = 0; */.  as
20220 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
20230 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
20240 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
20250 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
20260 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
20270 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
20280 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
20290 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
202a0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
202b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
202c0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
202d0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
202e0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
202f0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
20300 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
20310 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
20320 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
20330 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
20340 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
20350 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
20360 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
20370 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
20380 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
20390 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
203a0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
203b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
203c0 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
203d0 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
203e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
203f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20400 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
20410 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
20420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20430 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
20440 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
20450 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
20460 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
20470 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20480 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
20490 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
204a0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
204b0 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
204c0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
204d0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
204e0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
204f0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
20500 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
20510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
20520 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20530 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
20540 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
20550 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
20560 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20570 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
20580 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
20590 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
205a0 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
205b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
205c0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
205d0 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
205e0 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
205f0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
20600 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
20610 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
20620 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
20630 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
20640 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
20650 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
20660 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
20670 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
20680 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
20690 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
206a0 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
206b0 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
206c0 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
206d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
206e0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
206f0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
20700 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
20710 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
20720 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
20730 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
20740 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
20750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20760 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
20770 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
20780 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20790 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
207a0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
207b0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
207c0 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
207d0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
207e0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
207f0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
20800 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
20810 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
20820 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
20830 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
20840 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
20850 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
20860 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20870 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
20880 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
20890 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
208a0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
208b0 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
208c0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
208d0 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
208e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
208f0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
20900 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
20910 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
20920 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
20930 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
20940 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
20950 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
20960 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
20970 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
20980 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
20990 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
209a0 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
209b0 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
209c0 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
209d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
209e0 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
209f0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
20a00 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
20a10 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
20a20 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
20a30 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
20a40 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
20a50 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
20a60 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
20a70 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
20a80 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
20a90 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
20aa0 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20ab0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20ac0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
20ad0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
20ae0 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
20af0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20b00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20b10 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
20b20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
20b30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20b40 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
20b50 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
20b60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20b70 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
20b80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20b90 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
20ba0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
20bb0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
20bc0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
20bd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20bf0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
20c00 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
20c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20c20 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
20c30 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20c40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20c50 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20c60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
20c70 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
20c80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20c90 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
20ca0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
20cb0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
20cc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20cd0 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
20ce0 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
20cf0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20d00 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20d10 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20d20 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20d30 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20d40 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
20d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d60 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
20d70 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
20d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20d90 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
20da0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
20db0 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
20dc0 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
20dd0 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
20de0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
20df0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
20e00 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
20e10 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
20e20 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
20e30 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
20e40 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
20e50 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
20e60 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
20e70 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
20e80 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
20e90 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
20ea0 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
20eb0 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
20ec0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20ed0 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
20ee0 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
20ef0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
20f00 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
20f10 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
20f20 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
20f30 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
20f40 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
20f50 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
20f60 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
20f70 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
20f80 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
20f90 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
20fa0 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
20fb0 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
20fc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
20fd0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
20fe0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
20ff0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
21000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
21010 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
21020 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
21030 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
21040 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21050 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
21060 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
21070 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
21080 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
21090 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
210a0 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
210b0 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
210c0 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
210d0 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
210e0 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
210f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
21100 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
21110 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
21120 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
21130 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
21140 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
21150 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
21160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
21170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
21180 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21190 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
211a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
211b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
211c0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
211d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
211e0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
211f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21200 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
21210 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
21220 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
21230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21240 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21250 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21260 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21270 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21280 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
21290 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
212a0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
212b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
212c0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
212d0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
212e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
212f0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
21300 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
21310 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
21320 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
21330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
21340 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
21350 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21360 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
21370 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
21380 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
21390 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
213a0 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
213b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
213c0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
213d0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
213e0 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
213f0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
21400 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
21410 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
21420 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
21430 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
21440 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
21450 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21460 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
21470 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
21480 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21490 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
214a0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
214b0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
214c0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
214d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
214e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
214f0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
21500 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
21510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
21520 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
21530 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
21540 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21560 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21570 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
21580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21590 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
215a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
215b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
215c0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
215d0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
215e0 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
215f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
21600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
21610 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
21620 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
21630 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
21640 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
21650 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
21660 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
21670 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
21680 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
21690 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
216a0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
216b0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
216c0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
216d0 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
216e0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
216f0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
21700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
21710 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
21720 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
21730 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
21740 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
21750 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21760 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
21770 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
21780 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
21790 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
217a0 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
217b0 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
217c0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
217d0 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
217e0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
217f0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
21800 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
21810 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
21820 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21830 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
21840 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
21850 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
21860 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
21870 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
21880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21890 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
218a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
218b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
218c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
218d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
218e0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
218f0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
21900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
21910 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
21920 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
21930 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
21940 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
21950 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21960 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
21970 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21980 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
21990 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
219a0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
219b0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
219c0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
219d0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
219e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
219f0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
21a00 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
21a10 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
21a20 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
21a30 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
21a40 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
21a50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21a60 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21a70 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
21a80 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
21a90 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21aa0 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
21ab0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
21ac0 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
21ad0 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
21ae0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
21af0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
21b00 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
21b10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21b40 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  /.  i64 iOffset;
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b60 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
21b70 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20  of file to read 
21b80 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  from */..  asser
21b90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21ba0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26  >=PAGER_SHARED &
21bb0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
21bc0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21bd0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
21be0 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
21bf0 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
21c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21c10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
21c20 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
21c30 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
21c40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
21c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21c60 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65  OK;.  }.  iOffse
21c70 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
21c80 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
21c90 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
21ca0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21cb0 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
21cc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21cd0 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
21ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21cf0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21d00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21d10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21d20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75  pgno==1 ){.    u
21d30 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
21d40 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
21d50 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  a)[24];.    memc
21d60 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
21d70 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
21d80 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
21d90 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
21da0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
21db0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
21dc0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
21dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
21de0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
21df0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
21e00 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
21e10 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
21e20 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
21e30 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
21e40 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
21e50 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
21e60 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
21e70 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
21e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21ea0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
21eb0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
21ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21ed0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21ee0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
21ef0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
21f00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21f10 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
21f20 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
21f30 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
21f40 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
21f50 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
21f60 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
21f70 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
21f80 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
21f90 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
21fa0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
21fb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
21fc0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
21fd0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
21fe0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
21ff0 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
22000 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
22010 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22020 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
22030 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
22040 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  n PAGER_UNLOCK s
22050 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
22060 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
22070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
22080 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
22090 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
220a0 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
220b0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
220c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
220d0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
220e0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
220f0 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
22100 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
22110 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
22120 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
22130 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
22140 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
22150 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
22160 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
22170 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
22180 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
22190 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
221a0 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
221b0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
221c0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
221d0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
221e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
221f0 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
22200 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
22210 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
22220 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
22230 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
22240 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
22250 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
22260 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
22270 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
22280 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
22290 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
222a0 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
222b0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
222c0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
222d0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
222e0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
222f0 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
22300 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
22310 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
22320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
22330 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
22340 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
22350 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
22360 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
22370 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
22380 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32   described by (2
22390 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61  ) above is not a
223a0 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66  ttempted, and if
223b0 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73   the.** pager is
223c0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
223d0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
223e0 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74  LITE_FULL when t
223f0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  his is called,.*
22400 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  * the error stat
22410 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
22420 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20  returned. It is 
22430 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61  permitted to rea
22440 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
22450 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45  e when in SQLITE
22460 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74  _FULL error stat
22470 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
22480 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
22490 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
224a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
224b0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a  turned. If an.**
224c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
224d0 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
224e0 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
224f0 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
22500 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
22510 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
22520 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
22530 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
22540 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
22550 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22560 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
22570 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
22580 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22590 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
225a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
225b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f   */.  int isErro
225c0 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20  rReset = 0;     
225d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
225e0 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66   if recovering f
225f0 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20  rom error state 
22600 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
22610 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
22620 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
22630 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
22640 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
22650 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
22660 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
22670 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
22680 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
22690 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69  Cache)==0 );.  i
226a0 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26  f( NEVER(MEMDB &
226b0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
226c0 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61  e) ){ return pPa
226d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a  ger->errCode; }.
226e0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
226f0 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20  tabase is in an 
22700 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
22710 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
22720 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
22730 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
22740 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22750 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
22760 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  d rollback.  ** 
22770 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
22780 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
22790 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  em..  */.  if( p
227a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
227b0 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
227c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
227d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
227e0 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  l ){.      isErr
227f0 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
22800 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
22810 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
22820 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
22830 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
22840 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
22850 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
22860 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65  OCK || isErrorRe
22870 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
22880 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
22890 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
228a0 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
228b0 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  tJournal = 0;.  
228c0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
228d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
228e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
228f0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
22900 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
22910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
22920 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
22930 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22940 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20  >readOnly );.   
22950 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22960 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
22970 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22980 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
22990 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
229a0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
229b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
229c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
229d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
229e0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
229f0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  UNLOCK );.      
22a00 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
22a10 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
22a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22a30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22a40 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
22a50 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f  D_LOCK );..    /
22a60 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
22a70 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
22a80 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
22a90 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
22aa0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
22ab0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
22ac0 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
22ad0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
22ae0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
22af0 0a 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f  .    if( !isErro
22b00 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
22b10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22b20 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
22b30 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72  HARED );.      r
22b40 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
22b50 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
22b60 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
22b70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22b80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
22b90 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
22ba0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
22bb0 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
22bc0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
22bd0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
22be0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
22bf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22c00 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
22c10 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
22c20 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
22c30 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22c40 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
22c50 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
22c60 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
22c70 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
22c80 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
22c90 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
22ca0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
22cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
22cc0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
22cd0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
22ce0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
22cf0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
22d00 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
22d10 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
22d20 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
22d30 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
22d40 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
22d50 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
22d60 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
22d70 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
22d80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
22d90 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
22da0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
22db0 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
22dc0 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
22dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22de0 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
22df0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
22e00 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
22e10 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
22e20 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
22e30 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
22e40 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
22e50 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
22e60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
22e70 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
22e80 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
22e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22ea0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
22eb0 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
22ec0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
22ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22ef0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
22f00 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
22f10 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
22f20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22f30 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22f40 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
22f50 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  VE;.      }. .  
22f60 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
22f70 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
22f80 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
22f90 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
22fa0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n .      ** excl
22fb0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
22fc0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22fd0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
22fe0 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
22ff0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
23000 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
23010 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
23020 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
23030 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54  the.      ** OsT
23040 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
23050 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
23060 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
23070 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
23080 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
23090 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
230a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
230b0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
230c0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
230d0 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
230e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
230f0 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
23100 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
23110 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
23120 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  S,&res);.       
23130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23150 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
23160 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
23170 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23180 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
23190 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
231a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
231b0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
231c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
231d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
231e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
231f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
23200 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
23210 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
23220 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
23230 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23240 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23250 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
23260 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
23270 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23280 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
23290 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
232a0 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
232b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
232c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
232e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
232f0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
23300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23320 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
23330 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
23340 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
23350 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
23360 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
23370 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
23380 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
23390 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
233a0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
233b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
233c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
233d0 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
233e0 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
233f0 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20  Or, it .        
23400 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
23410 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
23420 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
23430 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
23440 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
23450 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
23460 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
23470 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
23480 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20   exist.  */.    
23490 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
234a0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
234b0 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
234c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
234d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
234e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
234f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23500 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
23510 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
23520 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65  ODO: Why are the
23530 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f  se cleared here?
23540 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79   Is it necessary
23550 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ? */.      pPage
23560 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
23570 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
23580 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
23590 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
235a0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
235b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
235c0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
235d0 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
235e0 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
235f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
23600 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
23610 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
23620 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
23630 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
23640 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
23650 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
23660 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
23670 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
23680 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
23690 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
236a0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
236b0 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  nt cache..      
236c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
236d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
236e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
236f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
23700 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
23710 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23730 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
23740 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
23750 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23760 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
23770 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23780 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
23790 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
237a0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20  ARED).          
237b0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
237c0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
237d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
237e0 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
237f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
23800 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
23810 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
23820 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
23830 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
23840 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
23850 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
23860 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
23870 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
23880 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
23890 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
238a0 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
238b0 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
238c0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
238d0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
238e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
238f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23900 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
23910 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
23920 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
23930 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
23940 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
23950 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
23960 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
23970 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
23980 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
23990 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
239a0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
239b0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
239c0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
239d0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
239e0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
239f0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
23a00 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
23a10 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
23a20 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
23a30 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
23a40 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
23a50 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
23a60 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
23a70 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
23a80 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
23a90 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
23aa0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
23ab0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
23ac0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
23ad0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
23ae0 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
23af0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
23b00 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
23b10 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
23b20 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
23b30 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
23b40 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
23b50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23b60 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
23b70 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
23b80 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
23b90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
23ba0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
23bb0 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
23bc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23be0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23bf0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
23c00 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
23c10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23c20 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
23c30 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
23c40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
23c50 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
23c60 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
23c70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
23c80 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
23c90 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
23ca0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
23cb0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
23cc0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
23cd0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
23ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
23cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23d00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23d10 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23d20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23d30 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
23d40 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
23d50 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
23d60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
23d70 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
23d80 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
23d90 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
23da0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
23db0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
23dc0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
23dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23de0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23df0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
23e00 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
23e10 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
23e20 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
23e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
23e50 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
23e60 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
23e70 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
23e80 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23e90 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
23ea0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
23eb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
23ed0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
23ee0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
23ef0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
23f00 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
23f10 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
23f20 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
23f30 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
23f40 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
23f50 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
23f60 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
23f70 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
23f80 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
23f90 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
23fa0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
23fb0 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
23fc0 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
23fd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
23fe0 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
23ff0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
24000 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
24010 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
24020 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
24030 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24040 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
24050 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
24060 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
24070 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
24080 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61  >0) .  ){.    pa
24090 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
240a0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
240b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
240c0 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
240d0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
240e0 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
240f0 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
24100 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
24110 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
24120 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
24130 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
24140 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
24150 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
24160 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
24170 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24180 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24190 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
241a0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
241b0 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
241c0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
241d0 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
241e0 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
241f0 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
24200 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
24210 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
24220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24230 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
24240 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
24250 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
24260 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
24270 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
24280 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
24290 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
242a0 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
242b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
242c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
242d0 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
242e0 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
242f0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
24300 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
24310 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
24320 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
24330 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
24340 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
24350 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
24360 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
24370 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24380 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
24390 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
243a0 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
243b0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
243c0 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
243d0 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
243e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
243f0 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
24400 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
24410 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
24420 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
24430 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
24440 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
24450 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
24460 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
24470 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
24480 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
24490 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
244a0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
244b0 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
244c0 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
244d0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
244e0 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
244f0 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
24500 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
24510 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
24520 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
24530 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
24540 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
24550 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
24560 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
24570 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
24580 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
24590 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
245a0 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
245b0 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
245c0 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
245d0 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
245e0 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
245f0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
24600 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
24610 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
24620 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
24630 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61   cache to popula
24640 74 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  te with the data
24650 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
24660 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
24670 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
24680 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
24690 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
246a0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
246b0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
246c0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
246d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
246e0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
246f0 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
24700 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
24710 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
24720 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
24730 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
24740 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
24750 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
24760 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
24770 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
24780 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
24790 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
247a0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
247b0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
247c0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
247d0 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
247e0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
247f0 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
24800 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
24810 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
24820 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
24830 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
24840 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
24850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
24860 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
24870 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
24880 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
24890 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
248a0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
248b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
248c0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
248d0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
248e0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
248f0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
24900 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
24910 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
24920 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
24930 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
24940 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
24950 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
24960 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
24970 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
24980 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
24990 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
249a0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
249b0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
249c0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
249d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
249e0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
249f0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
24a00 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
24a10 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
24a20 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
24a30 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
24a40 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
24a50 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
24a60 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
24a70 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
24a80 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
24a90 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
24aa0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
24ab0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
24ac0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
24ad0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
24ae0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
24af0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24b00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
24b10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
24b20 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
24b30 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
24b40 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
24b50 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
24b60 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
24b70 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
24b80 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
24b90 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
24ba0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
24bb0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
24bc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
24bd0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
24be0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
24bf0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
24c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24c10 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
24c20 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
24c30 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
24c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24c50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24c60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
24c70 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
24c80 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
24c90 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
24ca0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
24cb0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
24cc0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
24cd0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
24ce0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
24cf0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
24d00 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
24d10 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
24d20 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
24d30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24d40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24d50 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
24d60 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
24d70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
24d80 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
24d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24da0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
24db0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
24dc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
24dd0 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
24de0 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
24df0 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
24e00 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
24e10 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
24e20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
24e30 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
24e40 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
24e50 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
24e60 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
24e70 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
24e80 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
24e90 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
24ea0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
24eb0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
24ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
24ed0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
24ee0 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
24ef0 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
24f00 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
24f10 67 65 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  ge)->pPager ){. 
24f20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
24f30 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
24f40 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
24f50 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
24f60 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
24f70 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
24f80 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
24f90 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
24fa0 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
24fb0 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
24fc0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
24fd0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
24fe0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
24ff0 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
25000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
25010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
25020 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
25030 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
25040 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
25050 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
25060 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
25070 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ed.  */.    int 
25080 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52  nMax;..    PAGER
25090 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
250a0 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  iss);.    pPg = 
250b0 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
250c0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
250d0 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
250e0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
250f0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
25100 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25110 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
25120 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
25130 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
25140 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
25150 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
25160 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
25170 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
25180 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
25190 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
251a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
251b0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
251c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
251d0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
251e0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
251f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25200 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
25210 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20  er, &nMax);.    
25220 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25230 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
25240 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25250 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
25260 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
25270 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43   || MEMDB || noC
25280 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
25290 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
252a0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d  >mxPgno ){..rc =
252b0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67   SQLITE_FULL;..g
252c0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
252d0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
252e0 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
252f0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
25300 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
25310 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
25320 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
25330 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
25340 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
25350 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
25360 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
25370 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
25380 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
25390 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
253a0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
253b0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
253c0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
253d0 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
253e0 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
253f0 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
25400 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
25410 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
25420 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
25430 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
25440 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
25450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25460 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
25470 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
25480 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
25490 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
254a0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
254b0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
254c0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
254d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
254e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
254f0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
25500 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
25510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
25520 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
25530 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
25540 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
25550 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
25560 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25570 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
25580 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
25590 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
255a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
255b0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
255c0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
255d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
255e0 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  }.      IOTRACE(
255f0 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
25600 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
25610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25620 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
25630 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
25640 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
25650 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
25660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25680 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
25690 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
256a0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
256b0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
256c0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
256d0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
256e0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
256f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
25700 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
25710 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
25720 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
25730 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
25740 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
25750 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
25760 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
25770 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
25780 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
25790 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
257a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
257b0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
257c0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
257d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
257e0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
257f0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
25800 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
25810 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
25820 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
25830 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25840 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
25850 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
25860 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
25870 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
25880 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
25890 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
258a0 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
258b0 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
258c0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
258d0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
258e0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
258f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
25900 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
25910 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
25920 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
25930 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
25940 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
25950 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
25960 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
25970 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
25980 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
25990 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
259a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
259b0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
259c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
259d0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
259e0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
259f0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
25a00 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
25a10 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
25a20 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
25a30 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
25a40 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
25a50 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
25a60 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
25a70 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
25a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25a90 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
25aa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25ab0 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f  ->state > PAGER_
25ac0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  UNLOCK );.  sqli
25ad0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
25ae0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25af0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
25b00 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
25b10 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
25b20 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
25b30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
25b40 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
25b50 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
25b60 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
25b70 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
25b80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
25b90 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
25ba0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
25bb0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
25bc0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
25bd0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
25be0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
25bf0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
25c00 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
25c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25c20 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
25c30 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
25c40 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
25c50 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
25c60 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
25c70 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
25c80 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
25c90 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
25ca0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
25cb0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
25cc0 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  file has already
25cd0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e   been opened, en
25ce0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  sure that the.**
25cf0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
25d00 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49  e is open too. I
25d10 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
25d20 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a  al is not open,.
25d30 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
25d40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
25d50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
25d60 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
25d70 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
25d80 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a  rding to plan. .
25d90 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45  ** An SQLITE_IOE
25da0 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
25db0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
25dc0 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73   a call to .** s
25dd0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66  qlite3OsOpen() f
25de0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
25df0 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
25e00 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25e10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
25e30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25e40 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
25e50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
25e60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
25e70 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
25e80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
25e90 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
25ea0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
25eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
25ec0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
25ed0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
25ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
25ef0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
25f00 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
25f10 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
25f20 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
25f30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25f40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
25f50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
25f60 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
25f70 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
25f80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
25f90 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
25fa0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
25fb0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
25fc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
25fd0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
25fe0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
25ff0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
26000 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26010 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
26020 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
26030 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
26040 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
26050 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
26060 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
26070 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
26080 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
26090 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
260a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
260b0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
260c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
260d0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
260e0 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
260f0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
26100 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
26110 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
26120 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
26130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
26140 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
26150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
26160 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
26170 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
26180 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
26190 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
261a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
261b0 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
261c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
261d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
261e0 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
261f0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
26200 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
26210 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
26220 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
26230 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
26240 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
26250 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
26260 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
26270 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
26280 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
26290 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
262a0 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
262b0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
262c0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
262d0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
262e0 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
262f0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
26300 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
26310 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
26320 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
26330 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
26340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26350 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
26360 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
26370 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26380 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
263b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
263c0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
263d0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
263e0 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
263f0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
26400 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26410 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
26420 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
26430 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
26440 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
26450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
26460 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
26470 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
26480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26490 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
264a0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
264b0 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
264c0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
264d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
264e0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
264f0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
26500 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
26510 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
26520 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
26530 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
26540 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
26550 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
26560 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
26570 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
26580 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f  Code;..  /* TODO
26590 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70  : Is it really p
265a0 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68  ossible to get h
265b0 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56  ere with dbSizeV
265c0 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c  alid==0? If not,
265d0 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74  .  ** the call t
265e0 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o PagerPagecount
265f0 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  () can be remove
26600 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  d..  */.  testca
26610 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
26620 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
26630 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26640 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
26650 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  ;..  pPager->pIn
26660 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
26670 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
26680 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
26690 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
266a0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
266b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
266c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
266d0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
266e0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
266f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
26700 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
26710 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26720 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
26730 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
26740 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26750 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
26760 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
26770 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
26780 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
26790 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
267a0 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
267b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
267c0 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
267d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
267e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
267f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
26800 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
26810 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
26820 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
26830 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26840 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
26850 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
26860 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
26870 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26880 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
26890 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
268a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
268b0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
268c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
268d0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
268e0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
268f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26900 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
26910 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
26920 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
26930 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
26940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26950 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
26960 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
26970 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
26980 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
26990 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
269a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
269b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
269c0 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
269d0 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
269e0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
269f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26a00 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
26a10 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
26a20 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
26a30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
26a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26a50 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
26a60 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
26a70 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
26a80 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
26a90 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
26aa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
26ab0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
26ac0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
26ad0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
26ae0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
26af0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
26b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
26b10 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
26b20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
26b30 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
26b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
26b50 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
26b60 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
26b70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
26b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26b90 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
26ba0 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
26bb0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
26bc0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
26bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
26bf0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
26c00 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
26c10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
26c20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
26c30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26c40 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
26c50 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
26c60 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
26c70 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
26c80 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
26c90 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
26ca0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
26cb0 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
26cc0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
26cd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
26ce0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
26cf0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
26d00 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
26d10 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
26d20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26d30 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
26d40 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
26d50 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
26d60 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26d70 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
26d80 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
26d90 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
26da0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
26db0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
26dc0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
26dd0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
26de0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
26df0 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
26e00 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
26e10 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
26e20 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
26e30 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
26e40 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
26e50 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
26e60 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
26e70 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
26e80 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
26e90 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
26ea0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
26eb0 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
26ec0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
26ed0 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
26ee0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
26ef0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
26f00 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
26f10 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
26f20 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
26f30 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
26f40 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
26f50 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  of it..**.** If 
26f60 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
26f70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
26f80 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
26f90 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
26fa0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
26fb0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
26fc0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
26fd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
26fe0 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
26ff0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
27000 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
27010 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
27020 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
27030 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
27040 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
27050 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
27060 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
27070 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
27080 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
27090 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
270a0 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
270b0 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
270c0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
270d0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
270e0 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
270f0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
27100 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
27110 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
27120 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
27130 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
27140 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
27150 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
27160 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
27170 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
27180 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
271a0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
271b0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61  _UNLOCK );.  pPa
271c0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
271d0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
271e0 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67  mory;.  if( pPag
271f0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
27200 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
27210 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
27220 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
27230 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
27240 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
27250 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
27260 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
27270 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
27280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27290 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
272a0 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69  rameter.    ** i
272b0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
272c0 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
272d0 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
272e0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
272f0 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
27300 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
27310 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
27320 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
27330 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
27340 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
27350 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
27360 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
27370 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27380 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27390 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
273a0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
273b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
273c0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
273d0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
273e0 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69  ESERVED;.      i
273f0 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
27400 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
27410 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
27420 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
27430 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
27440 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
27450 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
27460 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75  s were successfu
27470 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70  lly obtained, op
27480 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  en the journal. 
27490 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77     ** file and w
274a0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
274b0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f  ournal-header to
274c0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
274d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
274e0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
274f0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
27500 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
27510 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
27520 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
27530 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
27540 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
27550 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27560 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
27570 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
27580 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
27590 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
275a0 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
275b0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
275c0 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
275d0 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
275e0 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
275f0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
27600 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
27610 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
27620 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
27630 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
27640 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
27650 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
27660 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
27670 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
27680 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
27690 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
276a0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
276b0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
276c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
276d0 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
276e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
276f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
27700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27710 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27720 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
27730 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
27740 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
27750 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
27760 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
27770 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27780 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
27790 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
277a0 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
277b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
277c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
277d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
277e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
277f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62  ert( !pPager->db
27800 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20  Modified );.    
27810 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f  /* Ignore any IO
27820 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
27830 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  rs within pager_
27840 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
27850 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75  ). The.    ** pu
27860 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
27870 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
27880 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
27890 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
278a0 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d     ** sub-system
278b0 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  . It doesn't mat
278c0 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ter if the journ
278d0 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  al-file is not p
278e0 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66  roperly.    ** f
278f0 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
27900 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
27910 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
27920 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
27930 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  way)..    */.   
27940 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27950 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
27960 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27970 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
27980 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
27990 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
279a0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
279b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
279c0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
279d0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
279e0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
279f0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
27a00 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
27a10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
27a20 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
27a30 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
27a40 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
27a50 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
27a60 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
27a70 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
27a80 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
27a90 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
27aa0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
27ab0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
27ac0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
27ad0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
27ae0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
27af0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
27b00 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
27b10 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
27b20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
27b30 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
27b40 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
27b50 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
27b60 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
27b70 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74   been.  ** start
27b80 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
27b90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27ba0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
27bb0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
27bc0 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
27bd0 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
27be0 65 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f  ed, we should no
27bf0 74 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e  t be.  ** callin
27c00 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
27c10 20 52 65 70 65 61 74 20 74 68 65 20 65 72 72 6f   Repeat the erro
27c20 72 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  r for robustness
27c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
27c40 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
27c50 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
27c60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
27c70 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
27c80 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
27c90 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
27ca0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
27cb0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
27cc0 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
27cd0 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
27ce0 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
27cf0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
27d00 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
27d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
27d20 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ERM;..  assert( 
27d30 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
27d40 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
27d50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
27d60 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
27d70 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
27d80 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
27d90 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
27da0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
27db0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
27dc0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
27dd0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
27de0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
27df0 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
27e00 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
27e10 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
27e20 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70  ge(pPg) ){.    p
27e30 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
27e40 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
27e50 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
27e60 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
27e70 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
27e80 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
27e90 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
27ea0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27eb0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
27ec0 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
27ed0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
27ee0 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
27ef0 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
27f00 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
27f10 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74  ve already start
27f20 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ed a transaction
27f30 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d  ,.    ** which m
27f40 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61  eans they have a
27f50 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65  cquired the nece
27f60 73 73 61 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20  ssary locks and 
27f70 6f 70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 61 20  opened.    ** a 
27f80 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
27f90 2e 20 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20  .  Double-check 
27fa0 74 6f 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  to makes sure th
27fb0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
27fc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27fd0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
27fe0 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61  n(pPager, 0, pPa
27ff0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
28000 79 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  y);.    if( NEVE
28010 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  R(rc!=SQLITE_OK)
28020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28030 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
28040 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
28050 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
28060 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
28070 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28080 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61  E_OFF ){.      a
28090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
280a0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
280b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
280c0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
280d0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
280e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
280f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28100 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
28110 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
28120 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
28130 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
28140 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
28150 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
28160 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
28170 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
28180 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
28190 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
281a0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
281b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
281c0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
281d0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
281e0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
281f0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
28200 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
28210 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
28220 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
28230 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
28240 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
28250 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
28260 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
28270 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
28280 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
28290 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
282a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
282b0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
282c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
282d0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
282e0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
282f0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
28300 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
28310 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
28320 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
28330 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
28340 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
28350 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
28360 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
28370 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
28380 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
28390 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
283a0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
283b0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
283c0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
283d0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
283e0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
283f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28400 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28410 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28450 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28460 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
28470 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
284a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
284b0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
284c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
284d0 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
284e0 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
284f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
28520 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
28530 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
28540 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
28550 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
28560 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28570 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
28580 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28590 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
285a0 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
285b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
285d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
285e0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
285f0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
28600 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
28610 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
28620 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
28630 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
28640 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
28650 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
28660 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28670 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
28680 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28690 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
286a0 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
286b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
286c0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
286d0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
286e0 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
286f0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
28700 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
28710 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
28720 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
28730 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
28740 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
28750 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
28760 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
28770 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
28780 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
28790 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
287a0 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
287b0 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
287c0 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
287d0 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
287e0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
287f0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
28800 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
28810 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28820 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
28830 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28840 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
28850 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
28860 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
28870 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
28880 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
28890 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
288a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
288b0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
288c0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
288d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
288e0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
288f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
28900 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
28910 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
28920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28930 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
28940 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
28950 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
28960 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
28970 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
28980 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
28990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
289a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
289b0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
289c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
289d0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
289e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
289f0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
28a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28a10 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
28a20 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
28a30 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
28a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28a60 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
28a70 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28a80 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
28a90 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
28aa0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
28ab0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
28ac0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
28ad0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28af0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28b10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
28b20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28b30 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
28b40 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
28b50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
28b60 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
28b70 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28b80 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28b90 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28ba0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28bb0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28bc0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
28bd0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28be0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
28bf0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
28c00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28c10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
28c20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28c40 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
28c50 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
28c60 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
28c70 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
28c80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
28c90 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
28ca0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
28cb0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
28cc0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
28cd0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
28ce0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
28cf0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
28d00 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
28d10 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
28d20 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
28d30 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
28d40 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
28d50 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
28d60 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
28d70 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
28d80 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
28d90 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
28da0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
28db0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
28dc0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
28dd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
28de0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
28df0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
28e00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28e10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
28e20 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
28e30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
28e40 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
28e50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
28e60 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
28e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
28e90 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
28ea0 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
28eb0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
28ec0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
28ed0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
28ee0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
28ef0 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
28f00 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
28f10 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
28f20 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
28f30 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
28f40 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
28f50 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
28f60 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
28f70 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
28f80 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
28f90 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
28fa0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
28fb0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
28fc0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
28fd0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
28fe0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
28ff0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
29000 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
29010 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
29020 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
29030 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
29040 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
29050 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
29060 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
29070 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
29080 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
29090 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
290a0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
290b0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
290c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
290d0 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
290e0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
290f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
29100 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29110 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
29120 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
29130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29140 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
29150 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
29160 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29170 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
29180 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
29190 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
291a0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
291b0 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
291c0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
291d0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
291e0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
291f0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
29200 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
29210 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
29220 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
29230 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29240 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29250 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29260 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
29270 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
29280 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29290 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
292a0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
292b0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
292c0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
292d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
292e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
292f0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
29300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29310 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
29320 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29330 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
29340 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
29350 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
29360 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
29370 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
29380 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
29390 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
293a0 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
293b0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
293c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
293d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
293e0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
293f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
29400 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
29410 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
29420 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
29430 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
29440 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
29450 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
29460 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
29470 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
29480 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
29490 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
294a0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
294b0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
294c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
294d0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
294e0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
294f0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
29500 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
29510 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
29520 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
29530 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29540 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
29550 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
29560 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
29570 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
29580 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
29590 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
295a0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
295b0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
295c0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
295d0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
295e0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
295f0 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
29600 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
29610 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
29620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29630 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
29640 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
29650 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
29660 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
29670 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
29680 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
29690 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
296a0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
296b0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
296c0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
296d0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
296e0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
296f0 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
29700 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
29710 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
29720 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
29730 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
29740 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
29750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29760 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
29770 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
29780 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
297a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
297b0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
297c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
297d0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
297e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
297f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29800 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
29820 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
29830 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
29840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29850 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29860 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29880 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29890 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
298a0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
298b0 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
298c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
298d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
298e0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
298f0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
29900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29910 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29920 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29930 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
29940 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
29950 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
29960 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
29970 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
29980 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
29990 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
299a0 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
299b0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
299c0 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
299d0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
299e0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
299f0 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
29a00 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
29a10 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
29a20 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
29a30 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
29a40 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
29a50 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
29a60 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
29a70 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
29a80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29a90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29ab0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
29ac0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
29ad0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
29ae0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
29af0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
29b00 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
29b10 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
29b20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29b30 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
29b40 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29b50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
29b60 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
29b70 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
29b80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29b90 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
29ba0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
29bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
29bc0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
29bd0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
29be0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29bf0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
29c00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
29c10 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
29c20 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
29c30 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
29c40 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
29c50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
29c60 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
29c70 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
29c80 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
29c90 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
29ca0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
29cb0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
29cc0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
29cd0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
29ce0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
29cf0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
29d00 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
29d10 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
29d20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
29d30 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
29d40 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
29d50 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
29d60 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
29d70 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
29d80 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
29d90 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
29da0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
29db0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
29dc0 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
29dd0 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
29de0 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
29df0 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
29e00 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
29e10 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
29e20 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
29e30 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
29e40 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  y.  This happens
29e50 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
29e60 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  hen.** the page 
29e70 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61  has been added a
29e80 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20  s a leaf of the 
29e90 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20  freelist and so 
29ea0 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e  its.** content n
29eb0 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73  o longer matters
29ec0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
29ed0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
29ee0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
29ef0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
29f00 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
29f10 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
29f20 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65  e is unused. The
29f30 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
29f40 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
29f50 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
29f60 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
29f70 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
29f80 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
29f90 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
29fa0 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65  on can quadruple
29fb0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
29fc0 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f  rge .** DELETE o
29fd0 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  perations..*/.vo
29fe0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
29ff0 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a  ontWrite(PgHdr *
2a000 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2a010 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2a020 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d  ger;.  if( (pPg-
2a030 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2a040 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
2a050 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
2a060 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2a070 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
2a080 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
2a090 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
2a0a0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
2a0b0 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
2a0c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2a0d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
2a0e0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2a0f0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2a100 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2a110 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
2a120 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
2a130 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2a140 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
2a150 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
2a160 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55  ined(SQLITE_SECU
2a170 52 45 5f 44 45 4c 45 54 45 29 20 2a 2f 0a 0a 2f  RE_DELETE) */../
2a180 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a190 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
2a1a0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2a1b0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
2a1c0 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
2a1d0 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
2a1e0 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
2a1f0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2a200 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
2a210 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
2a220 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
2a230 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2a240 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
2a250 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
2a260 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
2a270 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
2a280 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2a290 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
2a2a0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
2a2b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
2a2c0 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
2a2d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
2a2e0 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
2a2f0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
2a300 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
2a310 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
2a320 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
2a330 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
2a340 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
2a350 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
2a360 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
2a370 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
2a380 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2a390 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
2a3a0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2a3b0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
2a3c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a3d0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
2a3e0 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
2a3f0 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
2a400 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
2a410 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
2a420 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
2a430 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
2a440 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
2a450 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2a460 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
2a470 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
2a480 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2a490 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
2a4a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a4b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c  E_OK;..  /* Decl
2a4c0 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  are and initiali
2a4d0 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65  ze constant inte
2a4e0 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20  ger 'isDirect'. 
2a4f0 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d  If the.  ** atom
2a500 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2a510 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
2a520 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
2a530 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20  then isDirect.  
2a540 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ** is initialize
2a550 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  d to the value p
2a560 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44  assed as the isD
2a570 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65  irectMode parame
2a580 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ter.  ** to this
2a590 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
2a5a0 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61  wise, it is alwa
2a5b0 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
2a5c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64    **.  ** The id
2a5d0 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68  ea is that if th
2a5e0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2a5f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
2a600 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20  ot.  ** enabled 
2a610 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2a620 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61   the compiler ca
2a630 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73  n omit the tests
2a640 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65   of.  ** 'isDire
2a650 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65  ct' below, as we
2a660 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20  ll as the block 
2a670 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a  enclosed in the.
2a680 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65    ** "if( isDire
2a690 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e  ct )" condition.
2a6a0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
2a6b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2a6c0 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e  IC_WRITE.# defin
2a6d0 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a  e DIRECT_MODE 0.
2a6e0 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
2a6f0 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
2a700 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a710 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
2a720 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49  else.# define DI
2a730 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65  RECT_MODE isDire
2a740 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20  ctMode.#endif.. 
2a750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a760 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2a770 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
2a780 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
2a790 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
2a7a0 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
2a7b0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
2a7c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2a7d0 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
2a7e0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20  o page 1 */.    
2a7f0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
2a800 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
2a810 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
2a820 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  f change-counter
2a830 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61   field */..    a
2a840 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2a850 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
2a860 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2a870 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
2a880 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
2a890 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
2a8a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2a8b0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2a8c0 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
2a8d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
2a8e0 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
2a8f0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
2a900 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
2a910 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
2a920 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
2a930 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
2a940 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
2a950 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
2a960 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
2a970 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f  itable.  When no
2a980 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72  t in .    ** dir
2a990 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31  ect mode, page 1
2a9a0 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
2a9b0 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e  in cache and hen
2a9c0 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28  ce the PagerGet(
2a9d0 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69  ).    ** above i
2a9e0 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73  s always success
2a9f0 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20  ful - hence the 
2aa00 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51  ALWAYS on rc==SQ
2aa10 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a  LITE_OK..    */.
2aa20 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f      if( !DIRECT_
2aa30 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72  MODE && ALWAYS(r
2aa40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  c==SQLITE_OK) ){
2aa50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2aa60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2aa70 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  gHdr);.    }..  
2aa80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aa90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
2aaa0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
2aab0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
2aac0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
2aad0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
2aae0 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2aaf0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
2ab00 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
2ab10 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
2ab20 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75        change_cou
2ab30 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75  nter++;.      pu
2ab40 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
2ab50 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32  pPgHdr->pData)+2
2ab60 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
2ab70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  r);..      /* If
2ab80 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65   running in dire
2ab90 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74  ct mode, write t
2aba0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
2abb0 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c  age 1 to the fil
2abc0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
2abd0 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20  DIRECT_MODE ){. 
2abe0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
2abf0 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72  d *zBuf = pPgHdr
2ac00 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->pData;.       
2ac10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ac20 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b  >dbFileSize>0 );
2ac30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2ac40 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2ac50 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
2ac60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2ac70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2ac80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ac90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2aca0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2acb0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
2acc0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2acd0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ace0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2acf0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2ad00 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
2ad10 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
2ad20 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
2ad30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2ad40 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
2ad50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ad60 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
2ad70 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  r file to disk. 
2ad80 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
2ad90 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  for in-memory fi
2ada0 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  les.** or pages 
2adb0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
2adc0 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
2add0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2ade0 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f  ful, or called o
2adf0 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
2ae00 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
2ae10 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
2ae20 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2ae30 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
2ae40 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2ae50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
2ae60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2ae70 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
2ae80 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2ae90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aeb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2aec0 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
2aed0 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
2aee0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2aef0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2af00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2af10 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2af20 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2af30 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2af40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2af50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2af60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2af70 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
2af80 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
2af90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2afa0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
2afb0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
2afc0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
2afd0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2afe0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
2aff0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
2b000 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
2b010 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
2b020 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
2b030 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
2b040 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2b050 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
2b060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b070 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
2b080 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
2b090 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2b0a0 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
2b0b0 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
2b0c0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
2b0d0 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
2b0e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2b0f0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
2b100 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
2b110 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
2b120 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
2b130 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
2b140 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2b150 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
2b160 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
2b170 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
2b180 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b190 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
2b1a0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
2b1b0 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
2b1c0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
2b1d0 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
2b1e0 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
2b1f0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
2b200 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
2b210 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
2b220 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
2b230 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
2b240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b250 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
2b260 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
2b270 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
2b280 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
2b290 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
2b2a0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
2b2b0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
2b2c0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
2b2d0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
2b2e0 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
2b2f0 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
2b300 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
2b310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b320 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
2b330 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
2b340 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
2b350 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2b360 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
2b370 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
2b380 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
2b390 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
2b3a0 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
2b3b0 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
2b3c0 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
2b3d0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
2b3e0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2b3f0 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
2b400 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
2b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2b420 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
2b430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
2b440 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2b450 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
2b460 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2b470 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
2b480 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
2b490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b4a0 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
2b4b0 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
2b4c0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2b4d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b4f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2b500 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53    /* The dbOrigS
2b510 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74  ize is never set
2b520 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
2b530 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74  =OFF */.  assert
2b540 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2b550 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2b560 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
2b570 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2b580 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ze==0 );..  /* I
2b590 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
2b5a0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 72  occurred, this r
2b5b0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
2b5c0 74 20 62 65 20 63 61 6c 6c 65 64 2e 20 20 52 4f  t be called.  RO
2b5d0 4c 4c 42 41 43 4b 0a 20 20 2a 2a 20 69 73 20 74  LLBACK.  ** is t
2b5e0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
2b5f0 65 73 70 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72  esponse to an er
2b600 72 6f 72 2c 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e  ror, not COMMIT.
2b610 20 20 47 75 61 72 64 20 61 67 61 69 6e 73 74 0a    Guard against.
2b620 20 20 2a 2a 20 63 6f 64 69 6e 67 20 65 72 72 6f    ** coding erro
2b630 72 73 20 62 79 20 72 65 70 65 61 74 69 6e 67 20  rs by repeating 
2b640 74 68 65 20 70 72 69 6f 72 20 65 72 72 6f 72 2e  the prior error.
2b650 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2b660 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2b670 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
2b680 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
2b690 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
2b6a0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
2b6b0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
2b6c0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
2b6d0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2b6e0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
2b6f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
2b700 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
2b710 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2b720 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
2b730 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2b740 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
2b750 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
2b760 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
2b770 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
2b780 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2b790 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
2b7a0 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
2b7b0 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
2b7c0 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
2b7d0 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
2b7e0 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
2b7f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2b800 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
2b810 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
2b820 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
2b830 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
2b840 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61  ER_SYNCED && pPa
2b850 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2b860 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  ){..    /* The f
2b870 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75  ollowing block u
2b880 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
2b890 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74  e-counter. Exact
2b8a0 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a  ly how it.    **
2b8b0 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e   does this depen
2b8c0 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
2b8d0 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
2b8e0 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  update optimizat
2b8f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  ion.    ** was e
2b900 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2b910 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74  e time, and if t
2b920 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
2b930 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a  meets the .    *
2b940 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
2b950 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
2b960 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a  eration: .    **
2b970 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65  .    **    * The
2b980 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
2b990 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
2b9a0 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
2b9b0 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
2b9c0 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
2b9d0 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20  age-size, and . 
2b9e0 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20     **    * This 
2b9f0 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61  commit is not pa
2ba00 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
2ba10 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  le transaction, 
2ba20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20  and.    **    * 
2ba30 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  Exactly one page
2ba40 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
2ba50 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ed and store in 
2ba60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ba70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ba80 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
2ba90 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62  ion was not enab
2baa0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2bab0 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ime, then the.  
2bac0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2bad0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2bae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2baf0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
2bb00 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63   change.    ** c
2bb10 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72  ounter in 'indir
2bb20 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68  ect-mode'. If th
2bb30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2bb40 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75  s compiled in bu
2bb50 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
2bb60 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
2bb70 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
2bb80 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72  call sqlite3Jour
2bb90 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20  nalCreate().    
2bba0 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** to make sure 
2bbb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2bbc0 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
2bbd0 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  en created, then
2bbe0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67   call.    ** pag
2bbf0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2bc00 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
2bc10 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
2bc20 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74  nter in indirect
2bc30 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20  .    ** mode. . 
2bc40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68     **.    ** Oth
2bc50 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f  erwise, if the o
2bc60 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62  ptimization is b
2bc70 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20  oth enabled and 
2bc80 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20  applicable,.    
2bc90 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
2bca0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2bcb0 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
2bcc0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
2bcd0 6e 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27  nter.    ** in '
2bce0 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e  direct' mode. In
2bcf0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
2bd00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
2bd10 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a   never be.    **
2bd20 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
2bd30 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
2bd40 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
2bd50 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2bd60 43 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48 64  C_WRITE.    PgHd
2bd70 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
2bd80 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2bd90 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
2bda0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2bdb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bdc0 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28  E_OFF );.    if(
2bdd0 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f   !zMaster && isO
2bde0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2bdf0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
2be00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
2be10 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
2be20 67 65 72 29 20 0a 20 20 20 20 20 26 26 20 70 50  ger) .     && pP
2be30 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
2be40 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2be50 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50  .     && (0==(pP
2be60 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
2be70 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2be80 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
2be90 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
2bea0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2beb0 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69  Update the db fi
2bec0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
2bed0 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74  r via the direct
2bee0 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54  -write method. T
2bef0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  he .      ** fol
2bf00 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
2bf10 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d   modify the in-m
2bf20 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
2bf30 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a  tion of page 1 .
2bf40 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c        ** to incl
2bf50 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20  ude the updated 
2bf60 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
2bf70 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
2bf80 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64  ge 1 .      ** d
2bf90 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
2bfa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65  atabase file. Be
2bfb0 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
2bfc0 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20  mic-write .     
2bfd0 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
2bfe0 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
2bff0 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
2c000 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fe..      */.   
2c010 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2c020 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c030 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2c040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2c050 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2c060 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
2c070 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
2c080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2c0a0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c0b0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
2c0c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c0d0 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
2c0e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2c0f0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2c100 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
2c110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c120 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2c130 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2c140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2c150 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2c160 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
2c170 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
2c180 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  all pages.    **
2c190 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
2c1a0 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
2c1b0 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
2c1c0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2c1d0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54  l.    ** file. T
2c1e0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
2c1f0 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
2c200 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a  um mode..    **.
2c210 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
2c220 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
2c230 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
2c240 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2c250 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
2c260 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
2c270 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53  .dbSize, set dbS
2c280 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
2c290 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61  value.    ** tha
2c2a0 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65  t it took at the
2c2b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
2c2c0 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72  ansaction. Other
2c2d0 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a  wise, the.    **
2c2e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2c2f0 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75  3PagerGet() retu
2c300 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20  rn zeroed pages 
2c310 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20  instead of .    
2c320 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20  ** reading data 
2c330 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2c340 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
2c350 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e     ** When journ
2c360 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65  al_mode==OFF the
2c370 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61   dbOrigSize is a
2c380 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74  lways zero, so t
2c390 68 69 73 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  his.    ** block
2c3a0 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a   never runs if j
2c3b0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e  ournal_mode=OFF.
2c3c0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
2c3d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2c3e0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2c3f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
2c400 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2c410 20 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53   .     && ALWAYS
2c420 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
2c430 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2c440 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20  NALMODE_OFF).   
2c450 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   ){.      Pgno i
2c460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2c490 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2c4a0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
2c4b0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
2c4c0 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
2c4d0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
2c4e0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2c4f0 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50  Pgno dbSize = pP
2c500 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20  ager->dbSize;   
2c510 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2c520 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20  image size */ . 
2c530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2c540 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2c550 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
2c560 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b  for( i=dbSize+1;
2c570 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72   i<=pPager->dbOr
2c580 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  igSize; i++ ){. 
2c590 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
2c5a0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
2c5b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c5c0 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
2c5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
2c5e0 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20  Hdr *pPage;     
2c5f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2c600 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
2c610 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2c620 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2c630 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
2c640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c660 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c670 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2c680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c690 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2c6a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
2c6b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2c6c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c6d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c6e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c6f0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c710 20 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65    } .      pPage
2c720 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
2c730 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ze;.    }.#endif
2c740 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
2c750 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2c760 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
2c770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2c780 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a   a master .    *
2c790 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
2c7a0 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
2c7b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2c7c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c7d0 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  , .    ** or if 
2c7e0 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20  zMaster is NULL 
2c7f0 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  (no master journ
2c800 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63  al), then this c
2c810 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2c820 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2c830 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
2c840 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
2c850 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
2c860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c870 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2c880 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2c890 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2c8a0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
2c8b0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
2c8c0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
2c8d0 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20  ng.    ** used, 
2c8e0 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e  this call will n
2c8f0 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f  ot create the jo
2c900 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65  urnal file or pe
2c910 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a  rform any.    **
2c920 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f   real IO..    */
2c930 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  .    rc = syncJo
2c940 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2c950 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c960 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2c970 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2c980 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  t;..    /* Write
2c990 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2c9a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c9b0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63   file. */.    rc
2c9c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2c9d0 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
2c9e0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2c9f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
2ca00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ca10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ca20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2ca30 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2ca40 44 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  D );.      goto 
2ca50 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2ca60 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2ca70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
2ca80 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
2ca90 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a  PCache);..    /*
2caa0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
2cab0 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20  disk is not the 
2cac0 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65  same size as the
2cad0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
2cae0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65  .    ** then use
2caf0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
2cb00 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
2cb10 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
2cb20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2cb30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
2cb40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2cb50 7a 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ze ){.      Pgno
2cb60 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e   nNew = pPager->
2cb70 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72  dbSize - (pPager
2cb80 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f  ->dbSize==PAGER_
2cb90 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
2cba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cbb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2cbc0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
2cbd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2cbe0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
2cbf0 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  er, nNew);.     
2cc00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cc10 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2cc20 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2cc30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
2cc40 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
2cc50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2cc60 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
2cc70 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
2cc80 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
2cc90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2cca0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
2ccb0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
2ccc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
2ccd0 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
2cce0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
2ccf0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2cd00 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
2cd10 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
2cd20 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72  se_one_exit:.  r
2cd30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2cd40 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
2cd50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2cd60 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2cd70 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
2cd80 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
2cd90 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
2cda0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
2cdb0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
2cdc0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
2cdd0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2cde0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2cdf0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
2ce00 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2ce10 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
2ce20 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
2ce30 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
2ce40 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
2ce50 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
2ce60 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
2ce70 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
2ce80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
2ce90 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2cea0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ceb0 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
2cec0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
2ced0 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
2cee0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
2cef0 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
2cf00 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
2cf10 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
2cf20 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
2cf30 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
2cf40 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
2cf50 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
2cf60 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
2cf70 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
2cf80 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2cf90 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
2cfa0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2cfb0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
2cfc0 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
2cfd0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
2cfe0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
2cff0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d000 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
2d010 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2d020 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
2d030 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2d040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d060 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d070 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2d080 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
2d090 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
2d0a0 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
2d0b0 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
2d0c0 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
2d0d0 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
2d0e0 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
2d0f0 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
2d100 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
2d110 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
2d120 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
2d130 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
2d140 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
2d150 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2d160 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
2d170 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
2d180 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
2d190 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
2d1a0 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61  called if the pa
2d1b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74  ger is not in at
2d1c0 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45   least.  ** PAGE
2d1d0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2d1e0 2e 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c  . And indeed SQL
2d1f0 69 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74  ite never does t
2d200 68 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20  his. But it is. 
2d210 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65   ** nice to have
2d220 20 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20   this defensive 
2d230 74 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79  test here anyway
2d240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2d250 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ER(pPager->state
2d260 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29  <PAGER_RESERVED)
2d270 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d280 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e  _ERROR;..  /* An
2d290 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49   optimization. I
2d2a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  f the database w
2d2b0 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
2d2c0 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a  modified during.
2d2d0 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
2d2e0 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72  ction, the pager
2d2f0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
2d300 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e  xclusive-mode an
2d310 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20  d is.  ** using 
2d320 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
2d330 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66  als, then this f
2d340 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2d350 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  op..  **.  ** Th
2d360 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
2d370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
2d380 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61  ently contains a
2d390 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20   single journal 
2d3a0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74  .  ** header wit
2d3b0 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  h the nRec field
2d3c0 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75   set to 0. If su
2d3d0 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ch a journal is 
2d3e0 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68  used as.  ** a h
2d3f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e  ot-journal durin
2d400 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
2d410 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65  llback, 0 change
2d420 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20  s will be made. 
2d430 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
2d440 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65  ase file. So the
2d450 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
2d460 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61   zero the journa
2d470 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20  l .  ** header. 
2d480 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
2d490 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
2d4a0 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e  mode, there is n
2d4b0 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64  o need.  ** to d
2d4c0 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69  rop any locks ei
2d4d0 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2d4e0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2d4f0 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ied==0 && pPager
2d500 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2d510 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  .   && pPager->j
2d520 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2d530 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
2d540 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61  RSIST.  ){.    a
2d550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2d560 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
2d570 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
2d580 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
2d590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2d5a0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
2d5b0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
2d5c0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2d5d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2d5e0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
2d5f0 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c  YNCED || MEMDB |
2d600 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  | !pPager->dbMod
2d610 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ified );.  rc = 
2d620 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2d630 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2d640 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2d650 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ;.  return pager
2d660 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2d670 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  c);.}../*.** Rol
2d680 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
2d690 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  s. The database 
2d6a0 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
2d6b0 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
2d6c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2d6d0 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77  tion performs tw
2d6e0 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20  o tasks:.**.**  
2d6f0 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63   1) It rolls bac
2d700 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
2d710 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c  le, restoring al
2d720 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
2d730 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d  and .**      in-
2d740 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
2d750 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  es to the state 
2d760 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65  they were in whe
2d770 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2d780 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70  n.**      was op
2d790 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32  ened, and.**   2
2d7a0 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74  ) It finalizes t
2d7b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2d7c0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
2d7d0 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a  ot used for hot.
2d7e0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
2d7f0 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e   at any point in
2d800 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a   the future..**.
2d810 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  ** subject to th
2d820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c  e following qual
2d830 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  ifications:.**.*
2d840 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  * * If the journ
2d850 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79  al file is not y
2d860 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  et open when thi
2d870 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2d880 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  lled,.**   then 
2d890 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66  only (2) is perf
2d8a0 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ormed. In this c
2d8b0 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2d8c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2d8d0 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a    to roll back..
2d8e0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e  **.** * If in an
2d8f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
2d900 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
2d910 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28  ULL, then task (
2d920 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66  1) is .**   perf
2d930 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73  ormed. If succes
2d940 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20  sful, task (2). 
2d950 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
2d960 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f  e outcome.**   o
2d970 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72  f either, the er
2d980 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
2d990 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2d9a0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a   to the caller.*
2d9b0 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72  *   (i.e. either
2d9c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
2d9d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
2d9e0 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  ..**.** * If the
2d9f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
2da00 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
2da10 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
2da20 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20  (1). Whether.** 
2da30 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20    or not (1) is 
2da40 73 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f  succussful, also
2da50 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66   attempt (2). If
2da60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
2da70 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  urn.**   SQLITE_
2da80 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  OK. Otherwise, e
2da90 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2daa0 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
2dab0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
2dac0 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75  error code encou
2dad0 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  ntered. .**.**  
2dae0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2daf0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
2db00 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2db10 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  se was written t
2db20 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73  o. .**   So is s
2db30 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  afe to finalize 
2db40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2db50 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61   even if the pla
2db60 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65  yback .**   (ope
2db70 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64  ration 1) failed
2db80 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61  . However the pa
2db90 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74  ger must enter t
2dba0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  he error state.*
2dbb0 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65  *   as the conte
2dbc0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
2dbd0 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e  mory cache are n
2dbe0 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a  ow suspect..**.*
2dbf0 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  * * Finally, if 
2dc00 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
2dc10 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  VE state, then a
2dc20 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79  ttempt (1). Only
2dc30 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32  .**   attempt (2
2dc40 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63  ) if (1) is succ
2dc50 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53  essful. Return S
2dc60 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
2dc70 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68  essful,.**   oth
2dc80 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65  erwise enter the
2dc90 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
2dca0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
2dcb0 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  r code from the 
2dcc0 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70  .**   failing op
2dcd0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  eration..**.**  
2dce0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2dcf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2dd00 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
2dd10 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20  itten to. So if 
2dd20 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63  the.**   playbac
2dd30 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  k operation did 
2dd40 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77  not succeed it w
2dd50 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
2dd60 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20   to finalize.** 
2dd70 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
2dd80 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  le. It needs to 
2dd90 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
2dda0 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68  ile-system so th
2ddb0 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68  at.**   some oth
2ddc0 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75  er process can u
2ddd0 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  se it to restore
2dde0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
2ddf0 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74  ate (by.**   hot
2de00 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
2de10 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  k)..*/.int sqlit
2de20 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
2de30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2de40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2de50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2de60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2de70 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52   code */.  PAGER
2de80 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b  TRACE(("ROLLBACK
2de90 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2dea0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28  pPager)));.  if(
2deb0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2dec0 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28  fied || !isOpen(
2ded0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2dee0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
2def0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2df00 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2df10 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
2df20 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
2df30 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
2df40 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2df50 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
2df60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2df70 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
2df80 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
2df90 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
2dfa0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
2dfb0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
2dfc0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
2dfd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2dfe0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
2dff0 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
2e000 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
2e010 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e020 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e030 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
2e040 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2e050 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2e060 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
2e070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e080 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2e090 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
2e0a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e0b0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2e0c0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2e0d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
2e0e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
2e0f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2e100 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
2e110 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
2e120 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
2e130 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
2e140 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
2e150 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
2e160 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
2e170 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
2e180 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
2e190 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
2e1a0 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
2e1b0 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
2e1c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
2e1d0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2e1e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e1f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e200 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
2e210 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
2e220 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
2e230 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
2e240 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2e250 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
2e260 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
2e270 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
2e280 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
2e290 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2e2a0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
2e2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e2c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2e2d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2e2e0 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
2e2f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
2e300 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
2e310 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
2e320 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2e330 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2e340 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
2e350 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2e360 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2e370 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2e380 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
2e390 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2e3a0 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
2e3b0 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
2e3c0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
2e3d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
2e3e0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2e3f0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
2e400 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2e410 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
2e420 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
2e430 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
2e440 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
2e450 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
2e460 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
2e470 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
2e480 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2e490 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e4a0 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
2e4b0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
2e4c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e4d0 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
2e4e0 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
2e4f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
2e500 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
2e510 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2e520 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
2e530 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
2e540 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
2e550 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
2e560 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e570 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
2e580 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
2e590 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
2e5a0 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
2e5b0 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
2e5c0 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
2e5d0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
2e5e0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
2e5f0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
2e600 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
2e610 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
2e620 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  n true if this i
2e630 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
2e640 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
2e650 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
2e660 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e670 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
2e680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2e690 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
2e6a0 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69  t least nSavepoi
2e6b0 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70  nt savepoints op
2e6c0 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  en. If there are
2e6d0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65  .** currently le
2e6e0 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69  ss than nSavepoi
2e6f0 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f  nts open, then o
2e700 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  pen one or more 
2e710 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  savepoints.** to
2e720 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
2e730 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20  ference. If the 
2e740 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
2e750 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a  ints is already.
2e760 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76  ** equal to nSav
2e770 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69  epoint, then thi
2e780 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2e790 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
2e7a0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
2e7b0 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  ion fails, SQLIT
2e7c0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
2e7d0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
2e7e0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2e7f0 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75  e opening the su
2e800 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
2e810 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72  then an IO error
2e820 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75   code is.** retu
2e830 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2e840 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
2e850 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2e860 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67  penSavepoint(Pag
2e870 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2e880 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  nSavepoint){.  i
2e890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e8a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e8c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2e8d0 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67   nCurrent = pPag
2e8e0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
2e8f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2e900 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  t number of save
2e910 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28  points */..  if(
2e920 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72   nSavepoint>nCur
2e930 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rent && pPager->
2e940 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2e950 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2e980 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2e990 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  /.    PagerSavep
2e9a0 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20  oint *aNew;     
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e9c0 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65   New Pager.aSave
2e9d0 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a  point array */..
2e9e0 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
2e9f0 65 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65  ere is no active
2ea00 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
2ea10 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  sub-journal is o
2ea20 70 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74  pen or .    ** t
2ea30 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  he journal is al
2ea40 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  ways stored in m
2ea50 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73  emory */.    ass
2ea60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2ea70 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73  vepoint==0 || is
2ea80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2ea90 64 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  d) ||.          
2eaa0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2eab0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2eac0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2ead0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20  );..    /* Grow 
2eae0 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
2eaf0 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67  oint array using
2eb00 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75   realloc(). Retu
2eb10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2eb20 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c      ** if the al
2eb30 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20  location fails. 
2eb40 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20  Otherwise, zero 
2eb50 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20  the new portion 
2eb60 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a  in case a .    *
2eb70 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  * malloc failure
2eb80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f   occurs while po
2eb90 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74  pulating it in t
2eba0 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70  he for(...) loop
2ebb0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
2ebc0 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72     aNew = (Pager
2ebd0 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69  Savepoint *)sqli
2ebe0 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
2ebf0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2ec00 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50  epoint, sizeof(P
2ec10 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e  agerSavepoint)*n
2ec20 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b  Savepoint.    );
2ec30 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29  .    if( !aNew )
2ec40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2ec50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ec60 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61   }.    memset(&a
2ec70 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30  New[nCurrent], 0
2ec80 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43  , (nSavepoint-nC
2ec90 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66  urrent) * sizeof
2eca0 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
2ecb0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
2ecc0 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77  Savepoint = aNew
2ecd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  ;.    pPager->nS
2ece0 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65  avepoint = nSave
2ecf0 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50  point;..    /* P
2ed00 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65  opulate the Page
2ed10 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63  rSavepoint struc
2ed20 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63  tures just alloc
2ed30 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ated. */.    for
2ed40 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69  (ii=nCurrent; ii
2ed50 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  <nSavepoint; ii+
2ed60 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2ed70 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2ed80 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61  Valid );.      a
2ed90 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20  New[ii].nOrig = 
2eda0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2edb0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
2edc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
2edd0 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
2ede0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b  journalOff>0) ){
2edf0 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69  .        aNew[ii
2ee00 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ].iOffset = pPag
2ee10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
2ee20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ee30 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2ee40 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ffset = JOURNAL_
2ee50 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
2ee60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e        }.      aN
2ee70 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d  ew[ii].iSubRec =
2ee80 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2ee90 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
2eea0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  .pInSavepoint = 
2eeb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
2eec0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
2eed0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
2eee0 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
2eef0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  point ){.       
2ef00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ef10 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2ef20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e    }..    /* Open
2ef30 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ef40 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2ef50 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a  lready opened. *
2ef60 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  /.    rc = openS
2ef70 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2ef80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75  );.    assertTru
2ef90 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
2efa0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2efb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2efc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2efd0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
2efe0 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
2eff0 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61  se (commit) a sa
2f000 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20  vepoint..** The 
2f010 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c  savepoint to rel
2f020 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
2f030 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65   need not be the
2f040 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
2f050 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ** created savep
2f060 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  oint..**.** Para
2f070 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
2f080 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
2f090 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
2f0a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2f0b0 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
2f0c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f0d0 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
2f0e0 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
2f0f0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
2f100 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
2f110 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
2f120 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
2f130 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
2f140 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
2f150 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
2f160 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
2f170 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
2f180 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
2f190 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
2f1a0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2f1b0 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
2f1c0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2f1d0 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
2f1e0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
2f1f0 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
2f200 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
2f210 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
2f220 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
2f230 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
2f240 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2f250 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
2f260 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
2f270 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
2f280 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
2f290 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
2f2a0 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
2f2b0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2f2c0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2f2d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2f2e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
2f2f0 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
2f300 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2f310 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
2f320 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2f330 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2f340 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
2f350 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
2f360 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2f370 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
2f380 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
2f390 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
2f3a0 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
2f3b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
2f3c0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
2f3d0 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
2f3e0 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
2f3f0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
2f400 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
2f410 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
2f420 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
2f430 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
2f440 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
2f450 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
2f460 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
2f470 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
2f480 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
2f490 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
2f4a0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
2f4b0 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
2f4c0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
2f4d0 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
2f4e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2f4f0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2f500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2f510 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2f520 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
2f530 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2f540 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2f550 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
2f560 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
2f570 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
2f580 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
2f590 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2f5a0 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
2f5b0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
2f5c0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2f5d0 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
2f5e0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2f5f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f600 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
2f610 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2f620 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
2f630 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
2f640 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
2f650 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
2f660 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2f670 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
2f680 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
2f690 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2f6a0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2f6b0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2f6c0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2f6d0 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
2f6e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f6f0 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
2f700 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
2f710 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
2f720 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
2f730 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
2f740 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
2f750 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
2f760 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
2f770 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
2f780 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
2f790 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
2f7a0 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
2f7b0 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
2f7c0 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
2f7d0 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
2f7e0 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
2f7f0 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
2f800 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
2f810 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2f820 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
2f830 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
2f840 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2f850 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2f860 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
2f870 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2f880 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2f890 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
2f8a0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2f8b0 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = nNew;..    /*
2f8c0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
2f8d0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
2f8e0 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
2f8f0 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
2f900 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
2f910 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
2f920 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
2f930 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
2f940 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
2f950 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2f960 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
2f970 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
2f980 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
2f990 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
2f9a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
2f9b0 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
2f9c0 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
2f9d0 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
2f9e0 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
2f9f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
2fa00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2fa10 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
2fa20 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
2fa30 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
2fa40 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
2fa50 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
2fa60 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
2fa70 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
2fa80 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
2fa90 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
2faa0 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
2fab0 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
2fac0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2fad0 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
2fae0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2faf0 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
2fb00 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
2fb10 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
2fb20 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
2fb30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65  . */.    if( nNe
2fb40 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45  w==0 && op==SAVE
2fb50 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26  POINT_RELEASE &&
2fb60 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2fb70 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  sjfd) ){.      a
2fb80 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2fb90 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63  E_OK );.      rc
2fba0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
2fbb0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
2fbc0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
2fbd0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
2fbe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2fbf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2fc00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2fc10 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2fc20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2fc30 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2fc40 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2fc50 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2fc60 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2fc70 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
2fc80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2fc90 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
2fca0 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
2fcb0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
2fcc0 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
2fcd0 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
2fce0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2fcf0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
2fd00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2fd10 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
2fd20 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2fd30 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
2fd40 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
2fd50 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
2fd60 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2fd70 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
2fd80 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2fd90 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
2fda0 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
2fdb0 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
2fdc0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2fdd0 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
2fde0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2fdf0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2fe00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2fe10 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2fe20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2fe30 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
2fe40 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2fe50 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2fe60 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
2fe70 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
2fe80 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
2fe90 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
2fea0 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
2feb0 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
2fec0 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
2fed0 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
2fee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
2fef0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2ff00 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2ff10 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
2ff20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2ff30 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
2ff40 74 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68  t or retrieve th
2ff50 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
2ff60 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63   pager.*/.static
2ff70 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67   void sqlite3Pag
2ff80 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
2ff90 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
2ffa0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
2ffb0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
2ffc0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  int),.  void (*x
2ffd0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
2ffe0 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20  oid*,int,int),. 
2fff0 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
30000 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  ee)(void*),.  vo
30010 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20  id *pCodec.){.  
30020 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
30030 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
30040 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
30050 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70  er->pCodec);.  p
30060 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
30070 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20  pPager->memDb ? 
30080 30 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  0 : xCodec;.  pP
30090 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
300a0 43 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a  Chng = xCodecSiz
300b0 65 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d  eChng;.  pPager-
300c0 3e 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43  >xCodecFree = xC
300d0 6f 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67  odecFree;.  pPag
300e0 65 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f  er->pCodec = pCo
300f0 64 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f  dec;.  pagerRepo
30100 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
30110 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73  }.static void *s
30120 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f  qlite3PagerGetCo
30130 64 65 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  dec(Pager *pPage
30140 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
30150 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23  ger->pCodec;.}.#
30160 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
30170 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30180 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
30190 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
301a0 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
301b0 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
301c0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
301d0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
301e0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
301f0 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
30200 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
30210 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
30220 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
30230 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
30240 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
30250 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
30260 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
30270 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
30280 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
30290 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
302a0 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
302b0 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
302c0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
302d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
302e0 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
302f0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
30300 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
30310 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
30320 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
30330 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
30340 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
30350 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
30360 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
30370 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
30380 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
30390 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
303a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
303b0 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
303c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
303d0 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
303e0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
303f0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
30400 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
30410 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
30420 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
30430 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
30440 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
30450 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
30460 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
30470 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
30480 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
30490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
304a0 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20  ourth argument, 
304b0 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e  isCommit, is non
304c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73  -zero, then this
304d0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a   page is being.*
304e0 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20  * moved as part 
304f0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65  of a database re
30500 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73  organization jus
30510 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  t before the tra
30520 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nsaction .** is 
30530 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e  being committed.
30540 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
30550 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
30560 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
30570 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72  e page .** pPg r
30580 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f  efers to will no
30590 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
305a0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
305b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  s transaction..*
305c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
305d0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
305e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
305f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30600 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
30610 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  curs. Otherwise,
30620 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
30630 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
30640 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
30650 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
30660 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
30670 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73  gno pgno, int is
30680 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72  Commit){.  PgHdr
30690 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20   *pPgOld;       
306a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
306b0 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
306c0 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f  itten. */.  Pgno
306d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
306e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20  0;       /* Old 
306f0 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67  value of pPg->pg
30700 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72  no, if sync is r
30710 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
30720 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
30730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30740 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67  urn code */.  Pg
30750 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20  no origPgno;    
30760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
30770 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
30780 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73  number */..  ass
30790 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
307a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
307b0 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65   page being move
307c0 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68  d is dirty and h
307d0 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65  as not been save
307e0 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a  d by the latest.
307f0 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20    ** savepoint, 
30800 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75  then save the cu
30810 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
30820 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  f the page into 
30830 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
30840 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20  urnal now. This 
30850 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  is required to h
30860 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77  andle the follow
30870 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20  ing scenario:.  
30880 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
30890 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
308a0 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20  al page X, then 
308b0 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d  modify it in mem
308c0 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41  ory>.  **     SA
308d0 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a  VEPOINT one;.  *
308e0 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61  *       <Move pa
308f0 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  ge X to location
30900 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c   Y>.  **     ROL
30910 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
30920 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20  **.  ** If page 
30930 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74  X were not writt
30940 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
30950 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77  urnal here, it w
30960 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
30970 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73   possible to res
30980 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  tore its content
30990 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  s when the "ROLL
309a0 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a  BACK TO one".  *
309b0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65  * statement were
309c0 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20   is processed.. 
309d0 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72   **.  ** subjour
309e0 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65  nalPage() may ne
309f0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
30a00 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50  pace to store pP
30a10 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a  g->pgno into.  *
30a20 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  * one or more sa
30a30 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e  vepoint bitvecs.
30a40 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61   This is the rea
30a50 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  son this functio
30a60 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72  n.  ** may retur
30a70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
30a80 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
30a90 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
30aa0 59 20 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  Y .   && subjReq
30ab0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
30ac0 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
30ad0 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
30ae0 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
30af0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30b00 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
30b10 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
30b20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
30b30 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
30b40 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
30b50 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
30b60 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
30b70 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
30b80 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
30b90 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
30ba0 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
30bb0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
30bc0 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
30bd0 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
30be0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
30bf0 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
30c00 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
30c10 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
30c20 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
30c30 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
30c40 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
30c50 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
30c60 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
30c70 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
30c80 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
30c90 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
30ca0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
30cb0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
30cc0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
30cd0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
30ce0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
30cf0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
30d00 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
30d10 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
30d20 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
30d30 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
30d40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
30d50 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
30d60 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
30d70 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
30d80 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
30d90 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
30da0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
30db0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
30dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
30dd0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
30de0 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
30df0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
30e00 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
30e10 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
30e20 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
30e30 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
30e40 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
30e50 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
30e60 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
30e70 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
30e80 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
30e90 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
30ea0 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
30eb0 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
30ec0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
30ed0 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
30ee0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
30ef0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
30f00 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
30f10 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
30f20 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
30f30 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
30f40 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
30f50 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
30f60 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
30f70 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
30f80 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
30f90 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
30fa0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
30fb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
30fc0 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20  Drop(pPgOld);.  
30fd0 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20  }..  origPgno = 
30fe0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c  pPg->pgno;.  sql
30ff0 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
31000 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c  Pg, pgno);.  sql
31010 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
31020 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
31030 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
31040 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
31050 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
31060 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
31070 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
31080 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
31090 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
310a0 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
310b0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
310c0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
310d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
310e0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
310f0 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
31100 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
31110 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
31120 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
31130 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75   .    ** "is jou
31140 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66  rnaled" bitvec f
31150 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74  lag has been set
31160 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
31170 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20  be remedied by. 
31180 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68     ** loading th
31190 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
311a0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
311b0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
311c0 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
311d0 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  ** flag..    **.
311e0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
311f0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
31200 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
31210 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
31220 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
31230 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
31240 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
31250 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
31260 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
31270 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
31280 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
31290 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
312a0 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
312b0 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
312c0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
312d0 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
312e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
312f0 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
31300 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
31310 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
31320 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
31330 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
31340 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
31350 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
31360 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
31370 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
31380 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
31390 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
313a0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
313b0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
313c0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
313d0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
313e0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
313f0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
31400 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
31410 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
31420 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
31430 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
31440 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
31450 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
31460 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
31470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31480 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  K ){.      if( n
31490 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
314a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
314b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
314c0 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  t( pPager->pTmpS
314d0 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  pace!=0 );.     
314e0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
314f0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
31500 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
31510 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  ncPgno, pPager->
31520 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
31530 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
31540 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
31550 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
31560 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
31570 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
31580 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  =0 && !MEMDB );.
31590 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67      pPgHdr->flag
315a0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
315b0 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  SYNC;.    sqlite
315c0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
315d0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
315e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
315f0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
31600 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69  /*.  ** For an i
31610 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
31620 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
31630 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
31640 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f  ontinues.  ** to
31650 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20   exist, in case 
31660 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
31670 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61  needs to roll ba
31680 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63 61 74 65  ck.  We allocate
31690 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  .  ** the page n
316a0 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ow, instead of a
316b0 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62 65 63 61  t rollback, beca
316c0 75 73 65 20 77 65 20 63 61 6e 20 62 65 74 74 65  use we can bette
316d0 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77 69 74 68  r deal.  ** with
316e0 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
316f0 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20 20 54 69  y error now.  Ti
31700 63 6b 65 74 20 23 33 37 36 31 2e 0a 20 20 2a 2f  cket #3761..  */
31710 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
31720 20 20 20 20 44 62 50 61 67 65 20 2a 70 4e 65 77      DbPage *pNew
31730 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
31740 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
31750 50 61 67 65 72 2c 20 6f 72 69 67 50 67 6e 6f 2c  Pager, origPgno,
31760 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20   &pNew, 1);.    
31770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31780 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
31790 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
317a0 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20  , origPgno);.   
317b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
317c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
317d0 61 67 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b  agerUnref(pNew);
317e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
317f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
31800 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
31810 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31820 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
31830 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
31840 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
31850 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
31860 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
31870 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
31880 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
31890 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
318a0 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
318b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
318c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
318d0 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
318e0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
318f0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
31900 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
31910 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
31920 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
31930 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
31940 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
31950 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61  turn pPg->pExtra
31960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
31970 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
31980 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
31990 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
319a0 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
319b0 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
319c0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
319d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
319e0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
319f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31a00 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
31a10 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
31a20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
31a30 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
31a40 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
31a50 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
31a60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
31a70 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
31a80 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
31a90 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
31aa0 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
31ab0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
31ac0 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
31ad0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
31ae0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
31af0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
31b00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31b10 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
31b20 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
31b30 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
31b40 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
31b50 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
31b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
31b70 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
31b80 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
31b90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
31ba0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
31bb0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
31bc0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
31bd0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31be0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
31bf0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
31c00 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
31c10 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
31c20 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
31c30 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
31c40 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
31c50 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
31c60 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
31c70 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  iveMode = (u8)eM
31c80 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
31c90 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
31ca0 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
31cb0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
31cc0 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
31cd0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
31ce0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
31cf0 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a  must be one of:.
31d00 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  **.**    PAGER_J
31d10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
31d20 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31d30 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
31d40 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
31d50 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
31d60 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31d70 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
31d80 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31d90 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20  RNALMODE_OFF.** 
31da0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
31db0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a  MODE_MEMORY.**.*
31dc0 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
31dd0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
31de0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
31df0 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74 20 74  al_mode is set t
31e00 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  o the.** value s
31e10 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65 20  pecified if the 
31e20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65  change is allowe
31e30 64 2e 20 20 54 68 65 20 63 68 61 6e 67 65 20 69  d.  The change i
31e40 73 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s disallowed.** 
31e50 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
31e60 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  g reasons:.**.**
31e70 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f     *  An in-memo
31e80 72 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  ry database can 
31e90 6f 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f  only have its jo
31ea0 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74  urnal_mode set t
31eb0 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f  o _OFF.**      o
31ec0 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  r _MEMORY..**.**
31ed0 20 20 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61     *  The journa
31ee0 6c 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62  l mode may not b
31ef0 65 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20  e changed while 
31f00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
31f10 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54   active..**.** T
31f20 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69  he returned indi
31f30 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  cate the current
31f40 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
31f50 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ed) journal-mode
31f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31f70 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
31f80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
31f90 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
31fa0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
31fb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
31fc0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
31fd0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
31fe0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
31ff0 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ETE.            
32000 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32010 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
32020 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
32030 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32040 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
32050 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20  SIST.           
32060 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32070 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
32080 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
32090 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
320a0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
320b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
320c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
320d0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 69 66 28  QUERY<0 );.  if(
320e0 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20   eMode>=0.   && 
320f0 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65  (!MEMDB || eMode
32100 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32110 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
32120 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32130 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32140 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26 26  LMODE_OFF).   &&
32150 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32160 66 69 65 64 0a 20 20 20 26 26 20 28 21 69 73 4f  fied.   && (!isO
32170 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32180 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a   || 0==pPager->j
32190 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a  ournalOff).  ){.
321a0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
321b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
321c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
321d0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
321e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
321f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
32200 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
32210 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
32220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
32230 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
32240 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
32250 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
32260 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
32270 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74  files..**.** Set
32280 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69  ting the size li
32290 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20  mit to -1 means 
322a0 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f  no limit is enfo
322b0 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65  rced..** An atte
322c0 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d  mpt to set a lim
322d0 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  it smaller than 
322e0 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  -1 is a no-op..*
322f0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
32300 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
32310 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
32320 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
32330 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
32340 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
32350 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
32360 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
32370 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
32380 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
32390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
323a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
323b0 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e pPager->pBacku
323c0 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  p variable. The 
323d0 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a  backup module.**
323e0 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69   in backup.c mai
323f0 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65  ntains the conte
32400 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61  nt of this varia
32410 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65  ble. This module
32420 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71  .** uses it opaq
32430 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d  uely as an argum
32440 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61  ent to sqlite3Ba
32450 63 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e  ckupRestart() an
32460 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b  d.** sqlite3Back
32470 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e  upUpdate() only.
32480 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b  .*/.sqlite3_back
32490 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65  up **sqlite3Page
324a0 72 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72  rBackupPtr(Pager
324b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
324c0 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61  urn &pPager->pBa
324d0 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  ckup;.}..#endif 
324e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
324f0 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.