/ Hex Artifact Content
Login

Artifact 3250440da3ba886123d7f5976818d89e35b758f6:


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 20 20 70 50 61 67 65  NLOCK;.    pPage
b290: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
b2a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b2b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
b2c0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
b2d0: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
b2e0: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
b2f0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
b300: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
b310: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
b320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b330: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
b340: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
b350: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
b360: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
b370: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
b380: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
b390: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
b3a0: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
b3b0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
b3c0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
b3d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
b3e0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
b3f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
b400: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
b410: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
b420: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
b430: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
b440: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
b450: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
b460: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
b470: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
b480: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
b490: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
b4a0: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
b4b0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
b4c0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
b4d0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
b4e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
b4f0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b500: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
b510: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
b520: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
b530: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
b540: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
b550: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
b560: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b570: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
b580: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b590: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
b5a0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
b5b0: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
b5c0: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
b5d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
b5e0: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
b5f0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
b600: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
b610: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
b620: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
b630: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
b640: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
b650: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
b660: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b670: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
b680: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
b690: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
b6a0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
b6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
b6c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b6d0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
b6e0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
b6f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
b700: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
b710: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
b720: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
b730: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
b740: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
b750: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
b760: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
b770: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b780: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
b790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b7a0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
b7b0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
b7c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
b7d0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
b7e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b800: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
b810: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
b820: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
b830: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
b840: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
b850: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
b860: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
b870: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
b880: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
b890: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
b8a0: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
b8b0: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
b8c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
b8d0: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
b8e0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
b8f0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
b900: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
b910: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
b920: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
b930: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
b940: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
b950: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
b960: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
b970: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
b980: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
b990: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
b9a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b9b0: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
b9c0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
b9d0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
b9e0: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
b9f0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
ba00: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ba10: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
ba20: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
ba30: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
ba40: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
ba50: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
ba60: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
ba70: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
ba80: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
ba90: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
baa0: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
bab0: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
bac0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
bad0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
bae0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
baf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
bb00: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bb10: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
bb20: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
bb30: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
bb40: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
bb50: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
bb60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
bb70: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
bb80: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
bb90: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
bba0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bbb0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
bbc0: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
bbd0: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
bbe0: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
bbf0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
bc00: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
bc10: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
bc20: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
bc30: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
bc40: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
bc50: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
bc60: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
bc70: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
bc80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
bc90: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
bca0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
bcb0: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
bcc0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
bcd0: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
bce0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
bcf0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
bd00: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
bd10: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
bd20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
bd30: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
bd40: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
bd50: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
bd60: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
bd70: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
bd80: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
bd90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bda0: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
bdb0: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
bdc0: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
bdd0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
bde0: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
bdf0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
be00: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
be10: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
be20: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
be30: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
be40: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
be50: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
be60: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
be70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
be80: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
be90: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
bea0: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
beb0: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
bec0: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
bed0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
bee0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
bef0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
bf00: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
bf10: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
bf20: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
bf30: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
bf40: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
bf50: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bf60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
bf70: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
bf80: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
bf90: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
bfa0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
bfb0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
bfc0: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
bfd0: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
bfe0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
bff0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
c000: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
c010: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
c020: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
c030: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
c040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
c050: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
c060: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
c070: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
c080: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
c090: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
c0a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
c0b0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
c0c0: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
c0d0: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
c0e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c0f0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
c100: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
c110: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
c120: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
c130: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
c140: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c150: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
c160: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c170: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c180: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
c190: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
c1a0: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
c1b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
c1c0: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
c1d0: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
c1e0: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
c1f0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
c200: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
c210: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
c220: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
c230: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
c240: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
c250: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
c260: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
c270: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
c280: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
c290: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
c2a0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
c2b0: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
c2c0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
c2d0: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
c2e0: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
c2f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c300: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
c310: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
c320: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
c330: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c340: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
c350: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
c360: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
c370: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
c380: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
c390: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
c3a0: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
c3b0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
c3c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
c3d0: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
c3e0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
c3f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
c400: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
c410: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
c420: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
c430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c440: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
c450: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
c460: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
c470: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
c480: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
c490: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
c4a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
c4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
c4c0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
c4d0: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
c4e0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
c4f0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
c500: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
c510: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
c520: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
c530: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
c540: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
c550: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
c560: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
c570: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
c580: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
c590: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
c5a0: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c5c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
c5d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
c5e0: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
c5f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
c600: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c610: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c620: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
c630: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
c640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
c650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c660: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c670: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
c680: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
c690: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c6a0: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
c6b0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
c6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c6d0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c6e0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
c700: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
c710: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
c720: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
c730: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c740: 6a 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  jfd) ){..    /* 
c750: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
c760: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
c770: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
c780: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
c790: 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
c7a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c7b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
c7c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
c7d0: 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73  EMORY );.      s
c7e0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c7f0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c800: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
c810: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c820: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c830: 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
c840: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
c850: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
c860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c870: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
c880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c890: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
c8a0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
c8b0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c8c0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c8d0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c8e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c8f0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c900: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
c910: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
c920: 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
c930: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c940: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c950: 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a  _PERSIST.    ){.
c960: 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a        rc = zeroJ
c970: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
c980: 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20  , hasMaster);.  
c990: 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
c9a0: 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
c9b0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c9c0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c9d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c9e0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c9f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
ca00: 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
ca10: 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
ca20: 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
ca30: 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
ca40: 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
ca50: 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
ca60: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
ca70: 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
ca80: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
ca90: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
caa0: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
cab0: 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
cac0: 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
cad0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
cae0: 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
caf0: 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
cb00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
cb10: 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  al.  */.      as
cb20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
cb30: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
cb40: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
cb50: 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
cb60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
cb70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
cb80: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
cb90: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
cba0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
cbb0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
cbc0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
cbd0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cbe0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cbf0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
cc00: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
cc10: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
cc20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
cc30: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
cc40: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
cc50: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
cc60: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
cc70: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
cc80: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
cc90: 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  f..    sqlite3Pc
cca0: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
ccb0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
ccc0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
ccd0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
cce0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ccf0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
cd00: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  nal = 0;.    pPa
cd10: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cd20: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cd30: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
cd40: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
cd50: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
cd60: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
cd70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cd80: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
cd90: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
cda0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cdb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cdc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
cdd0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
cde0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cdf0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
ce00: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
ce10: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
ce20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
ce30: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
ce40: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
ce50: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
ce60: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
ce70: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
ce80: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
ce90: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
cea0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ceb0: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
cec0: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
ced0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
cee0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
cef0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
cf00: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
cf10: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
cf20: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
cf30: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
cf40: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
cf50: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
cf60: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
cf70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
cf80: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
cf90: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
cfa0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
cfb0: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
cfc0: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
cfd0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
cfe0: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
cff0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
d000: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
d010: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
d020: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
d030: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
d040: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
d050: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
d060: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
d070: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
d080: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
d090: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
d0a0: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
d0b0: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
d0c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
d0d0: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
d0e0: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
d0f0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d100: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
d110: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
d120: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
d130: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
d140: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
d150: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
d160: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
d170: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
d180: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
d190: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
d1a0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
d1b0: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
d1c0: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d1d0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d1e0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d1f0: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
d200: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
d210: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
d220: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
d230: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
d240: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
d250: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
d260: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
d270: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
d280: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
d290: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
d2a0: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
d2b0: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
d2c0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
d2d0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
d2e0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
d2f0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
d300: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
d310: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d320: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d330: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d340: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d350: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d360: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d370: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
d380: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
d390: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d3a0: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
d3b0: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
d3c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d3d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
d3e0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d3f0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d400: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d420: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
d430: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d440: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
d450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
d460: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
d470: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
d480: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
d490: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
d4a0: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
d4b0: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
d4c0: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
d4d0: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
d4e0: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
d4f0: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
d500: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
d510: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d520: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
d530: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d540: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
d550: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
d560: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
d570: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d580: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
d590: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
d5a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
d5b0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
d5c0: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
d5d0: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
d5e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
d5f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
d600: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
d610: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
d620: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
d630: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d640: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d650: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
d660: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
d670: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
d680: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
d690: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
d6a0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d6b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
d6c0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
d6d0: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
d6e0: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
d6f0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
d700: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d710: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
d720: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
d730: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
d740: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
d750: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d760: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
d770: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
d780: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
d790: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
d7a0: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
d7b0: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
d7c0: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
d7d0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
d7e0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
d7f0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d800: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d810: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d820: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d830: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
d840: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
d850: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d860: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
d870: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
d880: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
d890: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
d8a0: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
d8b0: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
d8c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
d8d0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
d8e0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
d8f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
d900: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
d910: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
d920: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d930: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
d940: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
d950: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
d960: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
d970: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
d980: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
d990: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
d9a0: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
d9b0: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
d9c0: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
d9d0: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
d9e0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
d9f0: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
da00: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
da10: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
da20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
da30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
da40: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
da50: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
da60: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
da70: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
da80: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
da90: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
daa0: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
dab0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dac0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
dad0: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
dae0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
daf0: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
db00: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
db10: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
db20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
db30: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
db40: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
db50: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
db60: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
db70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
db80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
db90: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
dba0: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
dbb0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
dbc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dbd0: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
dbe0: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
dbf0: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
dc00: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
dc10: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
dc20: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
dc30: 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63  /.  int isUnsync
dc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
dc60: 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63  ding from unsync
dc70: 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ed main journal 
dc80: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
dc90: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
dca0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
dcb0: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
dcc0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  ck */.  int isSa
dcd0: 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20  vepnt,          
dce0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
dcf0: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
dd00: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  llback */.  Bitv
dd10: 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20  ec *pDone       
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
dd30: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
dd40: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
dd50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
dd60: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
dd90: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
dda0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
ddb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ddc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
ddd0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
dde0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
ddf0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
de20: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
de30: 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
de40: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
de50: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
de60: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
de70: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
de80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dea0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
deb0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
dec0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  nal file */..  a
ded0: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
dee0: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
def0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
df00: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
df10: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
df20: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
df30: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
df40: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
df50: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
df60: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
df70: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
df80: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
df90: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
dfa0: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
dfb0: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
dfc0: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
dfd0: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
dfe0: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
dff0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e000: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
e010: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
e020: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
e030: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
e040: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e050: 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
e060: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
e070: 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
e080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
e090: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
e0a0: 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
e0b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
e0c0: 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
e0d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
e0e0: 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
e0f0: 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
e100: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
e110: 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
e120: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
e130: 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
e140: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e150: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
e160: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
e170: 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
e180: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e190: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
e1a0: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
e1b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e1c0: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
e1d0: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
e1e0: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
e1f0: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
e200: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
e210: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
e220: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
e230: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
e240: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
e250: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
e260: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
e270: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
e280: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
e290: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
e2a0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
e2b0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
e2c0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e2d0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
e2e0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
e2f0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
e300: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
e310: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
e320: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
e330: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
e340: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
e350: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
e360: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
e370: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
e380: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e390: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
e3a0: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
e3b0: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
e3c0: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
e3d0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
e3e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e3f0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
e400: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
e410: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
e420: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
e430: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
e440: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e450: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
e460: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
e470: 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
e480: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
e490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e4a0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
e4b0: 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  }..  if( pDone &
e4c0: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
e4d0: 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
e4e0: 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
e4f0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
e500: 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
e510: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
e520: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
e530: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
e540: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
e550: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
e560: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
e570: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
e580: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
e590: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
e5a0: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
e5b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
e5c0: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
e5d0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
e5e0: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
e5f0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
e600: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e610: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
e620: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
e630: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
e640: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
e650: 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
e660: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
e670: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
e680: 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
e690: 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
e6a0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
e6b0: 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
e6c0: 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
e6d0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
e6e0: 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
e6f0: 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
e700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
e710: 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
e720: 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
e730: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
e740: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
e750: 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
e760: 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
e770: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
e780: 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
e790: 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
e7a0: 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
e7b0: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
e7c0: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
e7d0: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
e7e0: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
e7f0: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
e800: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
e810: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
e820: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
e830: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
e840: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
e850: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e860: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
e870: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
e880: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
e890: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
e8a0: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
e8b0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
e8c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
e8d0: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
e8e0: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
e8f0: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
e900: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
e910: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
e920: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
e930: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
e940: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
e950: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
e960: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
e970: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
e980: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
e990: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
e9a0: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
e9b0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
e9c0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
e9d0: 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
e9e0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
e9f0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
ea00: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
ea10: 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
ea20: 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
ea30: 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
ea40: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ea50: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
ea60: 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
ea70: 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
ea80: 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
ea90: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
eaa0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
eab0: 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
eac0: 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
ead0: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
eae0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
eaf0: 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
eb00: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
eb10: 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
eb20: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
eb30: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
eb40: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
eb50: 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
eb60: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
eb70: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
eb80: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
eb90: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
eba0: 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
ebb0: 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
ebc0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
ebd0: 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
ebe0: 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
ebf0: 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
ec00: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
ec10: 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
ec20: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
ec30: 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
ec40: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
ec50: 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
ec60: 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
ec70: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
ec80: 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
ec90: 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
eca0: 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
ecb0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
ecc0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
ecd0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
ece0: 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
ecf0: 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
ed00: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
ed10: 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
ed20: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
ed30: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
ed40: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
ed50: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
ed60: 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
ed70: 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
ed80: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
ed90: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
eda0: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
edb0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
edc0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
edd0: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
ede0: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
edf0: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
ee00: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73  _SYNC)).   && is
ee10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
ee20: 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63  .   && !isUnsync
ee30: 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
ee40: 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
ee50: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
ee60: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
ee70: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ee80: 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
ee90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
eea0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
eeb0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
eec0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
eed0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
eee0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
eef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef00: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
ef10: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
ef20: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
ef30: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
ef40: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
ef50: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
ef60: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
ef70: 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
ef80: 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
ef90: 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
efa0: 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
efb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
efc0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
efd0: 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
efe0: 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
eff0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f000: 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
f010: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
f020: 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
f030: 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
f040: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
f050: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f060: 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
f070: 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
f080: 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
f090: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
f0a0: 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
f0b0: 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
f0c0: 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
f0d0: 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
f0e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f0f0: 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
f100: 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
f110: 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
f120: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
f130: 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
f140: 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
f150: 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
f160: 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
f170: 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
f180: 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
f190: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
f1a0: 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
f1b0: 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
f1c0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
f1d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
f1e0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
f1f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f200: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
f210: 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
f220: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
f230: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
f240: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
f250: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
f260: 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
f270: 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
f280: 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
f290: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
f2a0: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
f2b0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
f2c0: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
f2d0: 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
f2e0: 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
f2f0: 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
f300: 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
f310: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
f320: 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
f330: 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
f340: 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
f350: 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
f360: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
f370: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  t );.    if( (rc
f380: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
f390: 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
f3a0: 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d  gno, &pPg, 1))!=
f3b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f3c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f3d0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61    }.    pPg->fla
f3e0: 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
f3f0: 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
f400: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
f410: 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
f420: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
f430: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
f440: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
f450: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
f460: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
f470: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
f480: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
f490: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
f4a0: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
f4b0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
f4c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
f4d0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
f4e0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
f4f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
f500: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
f510: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
f520: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
f530: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
f540: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
f550: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
f560: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
f570: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
f580: 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
f590: 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
f5a0: 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
f5b0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f5c0: 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
f5d0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
f5e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69  );.    if( isMai
f5f0: 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
f600: 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
f610: 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
f620: 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
f630: 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
f640: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
f650: 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
f660: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
f670: 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
f680: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
f690: 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
f6a0: 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
f6b0: 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
f6c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f6d0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
f6e0: 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
f6f0: 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
f700: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
f710: 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
f720: 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
f730: 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
f740: 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a  to the..      **
f750: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
f760: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
f770: 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
f780: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
f790: 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
f7a0: 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
f7b0: 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
f7c0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
f7d0: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
f7e0: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
f7f0: 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
f800: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
f810: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
f820: 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
f830: 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
f840: 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
f850: 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
f860: 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
f870: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
f880: 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
f890: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
f8a0: 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
f8b0: 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
f8c0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
f8d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
f8e0: 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
f8f0: 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
f900: 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
f910: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f920: 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
f930: 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
f940: 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
f950: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
f960: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
f970: 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
f980: 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
f990: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
f9a0: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
f9b0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
f9c0: 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
f9d0: 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
f9e0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
f9f0: 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
fa00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
fa10: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
fa20: 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
fa30: 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
fa40: 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
fa50: 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
fa60: 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
fa70: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
fa80: 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
fa90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
faa0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
fab0: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
fac0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
fad0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
fae0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
faf0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
fb00: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
fb10: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
fb20: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
fb30: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
fb40: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
fb50: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
fb60: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
fb70: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
fb80: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
fb90: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
fba0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
fbb0: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
fbc0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
fbd0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
fbe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fbf0: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
fc00: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
fc10: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
fc20: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
fc30: 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
fc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
fc50: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
fc60: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
fc70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc80: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
fc90: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
fca0: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
fcb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fcc0: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
fcd0: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
fce0: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
fcf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fd00: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
fd10: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
fd20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
fd30: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
fd40: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
fd50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fd60: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
fd70: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
fd80: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
fd90: 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
fda0: 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
fdb0: 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
fdc0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
fdd0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
fde0: 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
fdf0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
fe00: 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
fe10: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
fe20: 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
fe30: 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
fe40: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
fe50: 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
fe60: 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
fe70: 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
fe80: 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
fe90: 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
fea0: 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
feb0: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
fec0: 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
fed0: 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
fee0: 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
fef0: 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
ff00: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
ff10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
ff20: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
ff30: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
ff40: 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
ff50: 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
ff60: 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
ff70: 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
ff80: 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
ff90: 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
ffa0: 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
ffb0: 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
ffc0: 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
ffd0: 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
ffe0: 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
fff0: 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10000 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10010 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10020 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10030 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10040 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10050 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10060 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10070 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10080 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
10090 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
100a0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
100b0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
100c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
100d0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
100e0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
100f0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10100 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10110 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10120 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10130 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10140 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10150 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10160 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10170 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10180 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
101a0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
101b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
101c0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
101d0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
101e0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
101f0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10200 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10210 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10220 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10230 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10240 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10250 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10260 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10270 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10280 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10290 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
102a0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
102b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
102c0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
102d0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
102e0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
102f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10300 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10310 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10320 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10330 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10340 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10350 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10360 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10370 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10380 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10390 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
103a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
103b0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
103c0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
103d0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
103e0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
103f0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10400 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10410 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10420 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10430 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10440 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10450 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10460 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10470 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
104a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
104b0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
104c0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
104d0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
104e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
104f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10500 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10510 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10520 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10530 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10540 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10550 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10560 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10570 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10580 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10590 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
105a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105b0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
105c0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
105d0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
105e0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
105f0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10600 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10610 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10620 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10630 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10640 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10660 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10670 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10680 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10690 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
106a0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
106b0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
106c0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
106d0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
106e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
106f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10700 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
10710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10720 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10730 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
10740 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10750 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
10760 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
10770 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
10780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10790 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
107a0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
107b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
107c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
107d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
107e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
107f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10800 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
10810 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
10820 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
10830 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
10840 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
10850 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
10860 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
10870 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
10880 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
10890 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108a0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
108b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
108c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
108d0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
108e0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
108f0 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
10900 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
10910 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
10920 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
10930 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
10940 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 20 20 69  rPtr + 1);.    i
10950 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
10960 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
10970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10980 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10990 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
109a0 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
109b0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
109c0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
109d0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
109e0 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
109f0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
10a00 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
10a10 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
10a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10a30 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10a40 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73  er_out;.    zMas
10a50 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
10a60 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
10a70 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
10a80 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
10a90 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
10aa0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
10ab0 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
10ac0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
10ad0 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
10ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10af0 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
10b00 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
10b10 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
10b20 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
10b30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10b40 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
10b50 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
10b60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
10b70 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
10b80 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
10b90 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
10ba0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
10bb0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
10bc0 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
10bd0 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
10be0 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
10bf0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
10c00 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
10c10 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
10c20 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
10c30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10c40 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
10c50 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
10c60 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
10c70 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
10c80 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
10c90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
10ca0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
10cb0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
10cc0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
10cd0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
10ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
10cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10d00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
10d10 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10d20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
10d30 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
10d40 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
10d50 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
10d60 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
10d70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
10d80 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
10d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10db0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
10dc0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
10dd0 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
10de0 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
10df0 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
10e00 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
10e10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10e30 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
10e40 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
10e50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e60 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
10e70 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10e80 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
10e90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10ea0 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
10eb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
10ec0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
10ed0 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
10ee0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10ef0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
10f00 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
10f10 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
10f20 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
10f30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
10f40 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
10f50 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72    .  if( pMaster
10f60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10f70 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
10f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
10f90 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
10fa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10fb0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
10fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10fd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10fe0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
10ff0 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
11000 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11010 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
11020 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11030 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
11040 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
11050 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11060 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
11070 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
11080 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
11090 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
110a0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
110b0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
110c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
110d0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
110e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
110f0 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
11100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11110 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
11120 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
11130 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
11140 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
11150 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
11160 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
11170 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
11180 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
11190 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
111a0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
111b0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
111c0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
111d0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
111e0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
111f0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
11200 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
11210 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
11220 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
11230 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
11240 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
11250 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
11260 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
11270 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
11280 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
11290 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
112a0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
112b0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
112c0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
112d0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
112e0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
112f0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
11300 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
11310 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
11320 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
11330 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11340 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
11350 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
11360 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
11370 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
11380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
11390 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
113a0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
113b0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
113c0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
113d0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
113e0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
113f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11400 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
11410 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
11420 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
11430 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
11440 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
11450 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
11460 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
11470 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
11480 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
11490 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
114a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
114b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
114c0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
114d0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
114e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
114f0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
11500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11510 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
11520 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
11530 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
11540 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
11550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11560 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11570 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
11580 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
115a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
115b0 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
115c0 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
115d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
11600 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11620 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11630 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11640 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
11650 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
11660 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
11670 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
11680 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
11690 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
116a0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
116b0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
116c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
116d0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
116e0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
116f0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
11700 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
11710 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
11720 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
11730 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
11740 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
11750 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
11760 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
11770 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
11780 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
11790 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
117a0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
117b0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
117c0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
117d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
117e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
117f0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
11800 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
11810 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
11820 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
11830 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
11840 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
11850 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
11860 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
11870 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
11880 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
11890 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
118a0 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
118b0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
118c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
118d0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
118e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
118f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
11900 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
11910 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11920 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
11930 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
11940 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
11950 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
11960 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11970 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
11980 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
11990 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
119a0 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
119b0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
119c0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
119d0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
119e0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
119f0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
11a00 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
11a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
11a20 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
11a30 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11a40 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
11a50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11a60 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
11a70 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
11a80 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
11a90 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
11aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
11ab0 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
11ac0 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
11ad0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
11ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
11af0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
11b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11b10 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
11b20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
11b30 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
11b40 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
11b50 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
11b60 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
11b70 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
11b80 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
11b90 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
11ba0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
11bb0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
11bc0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
11bd0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
11be0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
11bf0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
11c00 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
11c10 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
11c20 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
11c30 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
11c40 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
11c50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
11c60 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
11c70 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
11c80 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
11c90 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
11ca0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
11cb0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
11cc0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
11cd0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
11ce0 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
11cf0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
11d00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11d10 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
11d20 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
11d30 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
11d40 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
11d50 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
11d60 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
11d70 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
11d80 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
11d90 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
11da0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
11db0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
11dc0 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
11dd0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
11de0 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
11df0 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
11e00 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
11e10 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
11e20 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
11e30 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
11e40 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
11e50 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
11e60 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
11e70 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
11e80 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
11e90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11ea0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
11eb0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
11ec0 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
11ed0 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
11ee0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
11ef0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
11f00 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
11f10 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
11f20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
11f30 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
11f40 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
11f50 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
11f60 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
11f70 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
11f80 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
11f90 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
11fa0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
11fb0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
11fc0 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
11fd0 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
11fe0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
11ff0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
12000 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
12020 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
12030 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
12040 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
12050 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
12060 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
12070 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
12080 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
12090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
120a0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
120b0 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
120c0 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
120d0 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
120e0 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
120f0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
12100 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
12110 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
12120 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
12130 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
12140 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
12150 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
12160 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
12170 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
12180 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
12190 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
121a0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
121b0 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
121c0 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
121d0 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
121e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
121f0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
12200 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
12210 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
12220 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
12230 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
12240 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
12250 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
12260 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
12270 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
12280 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
12290 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
122a0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
122b0 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
122c0 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
122d0 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
122e0 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
122f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
12300 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
12310 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
12320 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
12330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
12340 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
12350 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
12360 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
12370 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
12380 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
12390 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
123a0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
123b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
123c0 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
123d0 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
123e0 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
123f0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
12400 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
12410 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
12420 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
12430 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
12440 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
12450 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
12460 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
12470 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
12480 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12490 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
124a0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
124b0 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
124c0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
124d0 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
124e0 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
124f0 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
12500 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
12510 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
12520 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
12530 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
12540 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
12550 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12560 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
12570 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
12580 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
12590 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
125a0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
125b0 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
125c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
125d0 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
125e0 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
125f0 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
12600 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
12610 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
12620 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
12630 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12640 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
12650 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
12680 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
12690 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
126a0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
126b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
126c0 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
126d0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
126e0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
126f0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
12700 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
12710 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
12720 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
12730 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
12740 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
12750 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
12780 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
12790 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127b0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
127c0 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
127d0 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
127e0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
127f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
12800 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12810 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
12820 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
12830 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
12840 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
12850 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
12860 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
12870 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12880 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
12890 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
128a0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
128b0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
128c0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
128d0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
128e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
128f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12900 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
12910 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
12920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12930 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
12940 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
12950 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
12960 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
12970 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
12980 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
12990 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
129a0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
129b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
129c0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
129d0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
129e0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
129f0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
12a00 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
12a10 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
12a20 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
12a30 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
12a40 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
12a50 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
12a60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
12a70 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
12a80 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
12a90 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
12aa0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
12ab0 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
12ac0 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
12ad0 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
12ae0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
12af0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
12b00 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
12b10 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
12b20 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
12b30 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
12b40 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
12b50 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
12b60 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
12b70 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
12b80 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
12b90 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
12ba0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
12bb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
12bc0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
12bd0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
12be0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
12bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12c00 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
12c10 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
12c20 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
12c30 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
12c40 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
12c50 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
12c60 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
12c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12c80 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
12c90 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12ca0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
12cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12cc0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
12cd0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
12ce0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
12cf0 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
12d00 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
12d10 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
12d20 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
12d30 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
12d40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
12d50 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
12d60 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
12d70 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
12d80 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79  {.    int isUnsy
12d90 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
12da0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
12db0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
12dc0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
12dd0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
12de0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
12df0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
12e00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
12e10 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
12e20 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
12e30 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
12e40 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
12e50 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
12e60 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
12e70 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
12e80 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
12e90 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
12ea0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
12eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
12ec0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12ed0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
12ee0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
12ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
12f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12f20 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
12f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f50 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12f60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12f70 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
12f80 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
12f90 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
12fa0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
12fb0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
12fc0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
12fd0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
12fe0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
12ff0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
13000 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
13010 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
13020 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
13030 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
13040 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
13050 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
13060 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
13070 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
13080 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
13090 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
130a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
130b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==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 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
130e0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
130f0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
13100 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
13110 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
13120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
13130 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
13140 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
13150 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
13160 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
13170 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
13180 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
13190 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
131a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
131b0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
131c0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
131d0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
131e0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
131f0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
13200 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
13210 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
13220 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
13230 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
13240 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
13250 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
13260 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
13270 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
13280 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
13290 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
132a0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
132b0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
132c0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
132d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
132e0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
132f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
13300 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
13310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
13320 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
13330 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
13340 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
13350 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
13360 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
13370 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
13380 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
13390 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
133a0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
133b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
133c0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
133d0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
133e0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
133f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13400 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
13410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
13420 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
13430 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
13440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13450 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
13460 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
13470 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
13480 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13490 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
134a0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
134b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
134c0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
134d0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
134e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
134f0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
13500 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13510 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31      isUnsync = 1
13520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13530 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
13540 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
13550 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13560 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
13570 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13580 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
13590 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
135a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
135b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
135c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
135d0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
135e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
135f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
13600 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
13610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13620 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
13630 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13640 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
13650 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
13660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13670 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
13680 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
13690 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
136a0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
136b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
136c0 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
136d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
136e0 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
136f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
13700 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
13710 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
13720 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
13730 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
13740 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
13750 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13760 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
13770 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e  ge(pPager,1,isUn
13780 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  sync,&pPager->jo
13790 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20  urnalOff,0,0);. 
137a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
137b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
137c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
137d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
137e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
137f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
13800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13810 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
13820 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13840 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
13850 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13860 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
13870 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
13880 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
13890 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
138a0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
138b0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
138c0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
138d0 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
138e0 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
138f0 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
13900 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
13910 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
13920 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
13930 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
13940 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
13950 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13960 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
13970 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13980 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13990 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
139a0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
139b0 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
139c0 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
139d0 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
139e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
139f0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
13a00 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
13a10 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
13a20 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
13a30 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
13a40 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
13a50 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
13a60 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
13a70 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
13a80 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
13a90 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
13aa0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
13ab0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
13ac0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
13ad0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
13ae0 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
13af0 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
13b00 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
13b10 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
13b20 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
13b30 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
13b40 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
13b50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
13b60 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
13b70 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
13b80 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
13b90 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
13ba0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
13bb0 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
13bc0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
13bd0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
13be0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
13bf0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
13c00 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
13c10 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
13c20 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
13c30 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
13c40 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
13c50 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
13c60 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
13c70 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
13c80 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
13c90 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
13ca0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
13cb0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
13cc0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
13cd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
13ce0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
13cf0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
13d00 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
13d10 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
13d20 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
13d30 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
13d40 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
13d50 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
13d60 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
13d70 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
13d80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
13d90 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
13da0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13db0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
13dc0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
13dd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13de0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
13df0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13e00 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
13e10 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
13e20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
13e30 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
13e40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13e50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
13e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13e70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
13e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e90 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
13ea0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
13eb0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
13ec0 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
13ed0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13ee0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
13ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13f00 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
13f10 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
13f20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
13f30 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
13f40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13f50 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
13f60 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
13f70 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
13f80 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13f90 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
13fa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
13fb0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
13fc0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
13fd0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13ff0 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
14000 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
14010 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
14020 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
14030 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
14040 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
14050 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
14060 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
14070 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
14080 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
14090 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
140a0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
140b0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
140c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
140d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
140e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
140f0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
14100 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
14110 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
14120 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
14130 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
14140 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
14150 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
14160 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
14170 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
14180 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
14190 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
141a0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
141b0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
141c0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
141d0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
141e0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
141f0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
14200 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
14210 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14220 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
14230 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
14240 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
14250 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
14260 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
14270 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
14280 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
14290 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
142a0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
142b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
142c0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
142d0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
142e0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
142f0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
14300 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
14310 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14320 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
14330 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
14340 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14350 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
14360 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14370 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
14380 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
14390 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
143a0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
143b0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
143c0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
143d0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
143e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
143f0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
14400 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
14410 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
14420 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14430 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
14440 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14450 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
14460 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
14470 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
14480 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14490 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
144a0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
144b0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
144c0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
144d0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
144e0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
144f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
14500 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
14510 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
14520 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
14530 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
14540 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
14550 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14560 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
14570 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
14580 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
14590 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
145a0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
145b0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
145c0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
145d0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
145e0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
145f0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
14600 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
14610 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
14620 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
14630 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
14640 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
14650 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14660 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
14670 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
14680 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
14690 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
146a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
146b0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
146c0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
146d0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
146e0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
146f0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
14700 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
14710 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
14720 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
14730 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
14740 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
14750 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
14760 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
14770 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
14780 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
14790 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
147a0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
147b0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
147c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
147d0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
147e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
147f0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
14800 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
14810 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
14820 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
14830 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
14840 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
14850 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
14860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
14870 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
14880 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
14890 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
148a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
148b0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
148c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
148d0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
148e0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
148f0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
14900 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
14910 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
14920 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14930 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
14940 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14950 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
14960 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
14970 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
14980 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
14990 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
149a0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
149b0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
149c0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
149d0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
149e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
149f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14a00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
14a10 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
14a20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
14a30 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
14a40 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
14a50 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
14a60 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
14a70 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
14a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
14a90 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
14aa0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
14ab0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
14ac0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
14ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
14ae0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
14af0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
14b00 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
14b10 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
14b20 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
14b30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
14b40 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
14b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14b60 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
14b70 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14b80 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
14b90 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
14ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
14bb0 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
14bc0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
14bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14be0 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ff;..  /* Begin 
14bf0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
14c00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
14c10 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
14c20 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
14c30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
14c40 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
14c50 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
14c60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
14c70 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
14c80 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
14c90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ca0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
14cb0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
14cc0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
14cd0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
14ce0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
14cf0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
14d00 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
14d10 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
14d20 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
14d30 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
14d40 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
14d50 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
14d60 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
14d70 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  t ){.    iHdrOff
14d80 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
14d90 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
14da0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
14db0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
14dc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14dd0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
14de0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
14df0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
14e00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14e10 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
14e20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14e30 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
14e40 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
14e50 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
14e60 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
14e70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14e80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
14e90 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
14ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
14eb0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
14ec0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
14ed0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
14ee0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
14ef0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
14f00 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
14f10 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
14f20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
14f30 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
14f40 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
14f50 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
14f60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14f70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
14f80 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
14f90 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
14fa0 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
14fb0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
14fc0 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
14fd0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
14fe0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
15000 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
15010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15030 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
15040 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
15050 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
15060 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
15070 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
15080 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
15090 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
150a0 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
150b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
150c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
150d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
150e0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
150f0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15100 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
15120 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
15130 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
15140 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
15150 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
15160 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
15170 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
15180 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
15190 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
151a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
151b0 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
151c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
151d0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
151e0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
151f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
15200 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
15210 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
15220 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15230 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
15240 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
15250 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
15260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15270 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
15280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15290 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
152a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
152b0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152c0 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
152d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
152e0 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
152f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15300 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
15310 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
15330 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15340 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff==szJ );..  
15350 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
15360 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
15370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15380 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
15390 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
153a0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
153b0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
153c0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
153d0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
153e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
153f0 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
15400 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
15410 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
15420 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
15430 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
15440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15450 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15460 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
15470 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
15480 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
15490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72  geSize);.    for
154a0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
154b0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
154c0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
154d0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
154e0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
154f0 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34  t( offset==ii*(4
15500 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
15510 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
15520 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15530 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15540 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20   0, 0, &offset, 
15550 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
15560 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15570 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15580 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
15590 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
155a0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
155b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
155c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
155d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72  f = szJ;.  }.  r
155e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
155f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
15600 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
15610 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
15620 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
15630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15640 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
15650 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15660 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15670 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
15680 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
15690 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
156a0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
156b0 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
156c0 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
156d0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
156e0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
156f0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
15700 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
15710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
15720 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
15730 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
15740 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
15750 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
15760 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
15770 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
15780 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
15790 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
157a0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
157b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
157c0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
157d0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
157e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
157f0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
15800 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
15810 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
15820 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
15830 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
15840 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
15850 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
15860 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
15870 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15880 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
15890 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
158a0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
158b0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
158c0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
158d0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
158e0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
158f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
15910 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
15920 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
15930 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
15940 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
15950 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
15960 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
15970 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
15980 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
15990 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
159a0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
159b0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
159c0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
159d0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
159e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
159f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
15a00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15a10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
15a20 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
15a30 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
15a40 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
15a50 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
15a60 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
15a70 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15a90 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
15aa0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
15ab0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
15ac0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
15ad0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
15ae0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
15af0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
15b00 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
15b10 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
15b20 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
15b30 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
15b40 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
15b50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
15b60 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
15b70 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
15b80 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
15b90 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
15ba0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
15bb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15bc0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
15bd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15be0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
15bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15c00 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
15c10 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
15c20 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
15c30 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
15c40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
15c50 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
15c60 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
15c70 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
15c80 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
15c90 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
15ca0 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
15cb0 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
15cc0 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
15cd0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
15ce0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
15cf0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15d00 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
15d10 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
15d20 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
15d30 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
15d40 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
15d50 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
15d60 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
15d70 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
15d80 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
15d90 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
15da0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
15db0 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
15dc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15dd0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
15de0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
15df0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
15e00 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
15e10 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
15e20 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
15e30 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
15e40 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
15e50 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
15e60 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
15e70 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
15e80 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
15e90 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
15ea0 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
15eb0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
15ec0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
15ed0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
15ee0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
15ef0 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
15f00 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
15f10 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
15f20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
15f30 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
15f40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15f50 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
15f60 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
15f70 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
15f80 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
15f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
15fa0 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
15fb0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
15fc0 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
15fd0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
15fe0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
15ff0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
16000 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16010 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16020 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
16030 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
16040 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
16050 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
16060 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
16070 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
16080 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
16090 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
160a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
160b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
160c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
160d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
160e0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
160f0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
16100 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
16110 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
16120 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
16130 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16140 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16150 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
16160 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16170 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
16180 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
16190 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
161a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
161b0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
161c0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
161d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
161e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
161f0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
16200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16210 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
16220 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
16230 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
16240 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
16250 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
16260 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
16270 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
16280 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
16290 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
162a0 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
162b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
162c0 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
162d0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
162e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
162f0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
16300 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
16310 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
16320 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
16330 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
16340 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
16350 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
16360 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
16370 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
16380 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
16390 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
163a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
163b0 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
163c0 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
163f0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
16400 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
16440 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
16450 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
16460 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
16470 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16480 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
16490 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
164a0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
164b0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
164c0 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
164d0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
164e0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
164f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
16500 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
16510 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
16520 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
16530 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
16540 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
16550 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
16560 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
16570 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
16580 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
16590 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
165a0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
165b0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
165c0 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
165d0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
16600 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
16610 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
16620 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16630 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
16640 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
16650 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
16660 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
16670 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
16680 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
16690 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
166a0 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
166b0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
166c0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
166d0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
166e0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
166f0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
16700 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
16710 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
16720 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16730 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
16740 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
16750 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16760 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
16770 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
16780 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
16790 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
167a0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
167b0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
167c0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
167d0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
167e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
167f0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16810 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
16820 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
16830 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
16840 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
16850 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
16860 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
16870 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
16880 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
16890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
168a0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
168b0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
168c0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
168d0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
168e0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
168f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16900 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
16910 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
16920 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
16930 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
16940 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16950 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
16960 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
16970 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
16980 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
16990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
169a0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
169b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
169c0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
169d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
169e0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
169f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
16a00 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
16a10 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
16a20 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
16a30 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
16a40 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
16a50 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
16a60 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
16a70 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
16a80 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
16a90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
16aa0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
16ab0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
16ac0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
16ad0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16ae0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
16af0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
16b00 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
16b10 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
16b20 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
16b30 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
16b40 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
16b50 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
16b60 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
16b70 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
16b80 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
16b90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
16ba0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
16bb0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
16bc0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
16bd0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
16be0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
16bf0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
16c00 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
16c10 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16c20 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
16c30 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
16c40 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
16c50 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
16c60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16c70 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
16c80 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
16c90 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
16ca0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
16cb0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
16cc0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
16cd0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
16ce0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
16cf0 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
16d00 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
16d10 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
16d20 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
16d30 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
16d40 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
16d50 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
16d60 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
16d70 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
16d80 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
16d90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
16db0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
16dc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
16dd0 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  16 *pPageSize, i
16de0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
16df0 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
16e00 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
16e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16e20 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
16e30 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
16e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
16e50 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
16e60 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
16e70 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
16e80 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
16e90 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
16ea0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
16eb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
16ec0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
16ed0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
16ee0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
16ef0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65  =0 .     && page
16f00 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
16f10 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
16f20 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
16f30 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
16f40 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
16f50 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
16f60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
16f70 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
16f80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16fa0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
16fb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
16fc0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
16fd0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
16fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
16ff0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
17000 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
17010 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
17020 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
17030 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17040 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
17050 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
17060 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17070 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
17080 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
17090 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
170a0 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
170b0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
170c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
170d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
170e0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
170f0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
17100 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
17110 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
17120 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
17130 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
17140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17160 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17170 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
17180 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
17190 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
171a0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
171b0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
171c0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
171d0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
171e0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
171f0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
17200 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
17210 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
17220 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
17230 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
17240 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
17250 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
17260 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
17270 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
17280 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
17290 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
172a0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
172b0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
172c0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
172d0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
172e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
172f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
17300 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
17310 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17320 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
17330 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
17340 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
17350 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
17360 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
17370 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
17380 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
17390 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
173a0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
173b0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
173c0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
173d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
173e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
173f0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
17400 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
17410 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
17420 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
17430 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17440 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
17450 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
17460 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
17470 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
17480 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
17490 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
174a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
174b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
174c0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
174d0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
174e0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
174f0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
17500 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
17510 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
17520 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
17530 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
17540 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
17550 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
17560 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
17570 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
17580 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
17590 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
175a0 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
175b0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
175c0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
175d0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
175e0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
175f0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
17600 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
17610 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17620 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
17630 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17640 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
17650 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
17660 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
17670 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17680 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
17690 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
176a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
176b0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
176c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
176d0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
176e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
176f0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
17700 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
17710 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
17720 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
17730 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
17740 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17750 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
17760 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
17770 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
17780 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
17790 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
177a0 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
177b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
177c0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
177d0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
177e0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
177f0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
17800 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
17810 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
17820 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
17830 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
17840 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
17850 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
17860 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
17870 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
17880 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
17890 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
178a0 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
178b0 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
178c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
178d0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
178e0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
178f0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
17900 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
17910 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
17920 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
17930 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
17940 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
17950 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
17960 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
17970 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
17980 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
17990 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
179a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
179b0 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
179c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
179d0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
179e0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
179f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
17a00 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
17a10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17a20 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
17a30 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
17a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17a50 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
17a60 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
17a70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17a80 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
17a90 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66  tempFile );.  if
17aa0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17ab0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
17ac0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
17ad0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
17ae0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
17af0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
17b00 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
17b10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
17b20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
17b30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
17b40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
17b80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
17b90 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
17ba0 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
17bb0 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
17bc0 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
17bd0 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
17be0 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
17bf0 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
17c00 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
17c10 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
17c20 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
17c30 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
17c40 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
17c50 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
17c60 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
17c70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17c80 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
17c90 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17ca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17cb0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
17cc0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
17cd0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17ce0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
17cf0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
17d00 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
17d10 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
17d20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
17d30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
17d40 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
17d50 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
17d60 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
17d70 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
17d80 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
17d90 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
17da0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
17db0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
17dc0 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
17dd0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
17de0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
17df0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
17e00 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
17e10 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
17e20 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17e30 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
17e40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17e50 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
17e60 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
17e70 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e90 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
17ea0 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
17eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
17ec0 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69  ger is already i
17ed0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
17ee0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
17ef0 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69  ror code. */.  i
17f00 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17f10 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
17f20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
17f40 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
17f50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17f60 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
17f70 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
17f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
17f90 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
17fa0 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
17fb0 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
17fc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fe0 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
17ff0 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
18000 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18020 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
18030 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
18040 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
18050 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
18060 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18070 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18080 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
18090 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
180a0 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
180b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
180c0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
180d0 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61  n))) ){.      pa
180e0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
180f0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
18100 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18110 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
18120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18130 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
18140 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
18150 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
18160 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
18170 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18180 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18190 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
181a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
181b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
181c0 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
181d0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
181e0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
181f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18200 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
18210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
18220 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
18230 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
18240 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
18250 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
18260 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
18270 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
18280 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
18290 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
182a0 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
182b0 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
182c0 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
182d0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
182e0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
182f0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
18300 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
18310 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
18320 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
18330 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20  ITE_OK */.  if( 
18340 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  pnPage ){.    *p
18350 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
18360 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18370 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
18380 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
18390 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
183a0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
183b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
183c0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
183d0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
183e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
183f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
18400 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
18410 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
18420 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
18430 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
18440 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
18450 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
18460 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
18470 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
18480 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
18490 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
184a0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
184b0 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
184c0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
184d0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
184e0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
184f0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
18500 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
18510 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
18520 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18530 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
18540 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
18550 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
18560 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
18570 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
18580 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
18590 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
185a0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
185b0 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
185c0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
185d0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
185e0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
185f0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
18600 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
18610 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18640 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
18650 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
18660 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
18670 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
18680 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
18690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
186a0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
186b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
186c0 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
186d0 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
186e0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
186f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
18700 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18710 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18720 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
18730 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
18740 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
18750 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a   unknown. It.  *
18760 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  * must not have 
18770 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
18780 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
18790 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
187a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
187b0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
187c0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
187d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
187e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
187f0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
18800 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
18810 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
18820 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
18830 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
18840 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
18850 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
18860 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
18870 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
18880 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
18890 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
188a0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
188b0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
188c0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
188d0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
188e0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
188f0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
18900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18910 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
18920 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
18930 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61   || (pPager->sta
18940 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18950 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
18960 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
18970 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
18980 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
18990 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65  RVED && locktype
189a0 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
189b0 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  E).  );..  if( p
189c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
189d0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
189e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
189f0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
18a00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18a10 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
18a20 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
18a30 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
18a40 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
18a50 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
18a60 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
18a70 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
18a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28  Pager->state = (
18ab0 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  u8)locktype;.   
18ac0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
18ad0 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
18ae0 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
18af0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18b00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
18b10 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
18b20 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
18b30 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
18b40 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
18b50 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
18b60 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
18b70 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
18b80 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
18b90 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
18ba0 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
18bb0 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
18bc0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
18bd0 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
18be0 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
18bf0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
18c00 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
18c10 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
18c20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
18c30 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
18c40 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
18c50 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
18c60 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
18c70 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
18c80 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
18c90 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
18ca0 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
18cb0 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
18cc0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
18cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
18ce0 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
18cf0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
18d00 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
18d10 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
18d20 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
18d30 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
18d40 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
18d50 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
18d60 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
18d70 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
18d80 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
18d90 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
18da0 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
18db0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
18dc0 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
18dd0 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
18de0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
18df0 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
18e00 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
18e10 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20  aviour would be 
18e20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
18e30 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
18e40 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
18e50 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
18e60 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
18e70 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
18e80 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
18e90 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
18ea0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
18eb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
18ec0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
18ed0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
18ee0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
18ef0 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
18f00 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
18f10 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
18f20 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
18f30 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
18f40 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
18f50 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
18f60 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
18f70 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
18f80 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
18f90 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
18fa0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
18fb0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
18fc0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
18fd0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
18fe0 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
18ff0 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
19000 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
19010 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
19020 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
19030 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
19040 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
19050 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
19060 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
19070 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
19080 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
19090 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
190a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
190b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
190c0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
190d0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
190e0 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
190f0 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
19100 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
19110 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
19120 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
19130 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
19140 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
19150 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
19160 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
19170 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
19180 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
19190 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
191a0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
191b0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
191c0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
191d0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
191e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
191f0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
19200 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19210 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
19220 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19230 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
19240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19250 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
19260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19270 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
19280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19290 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
192a0 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
192b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
192c0 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e  ge;.  assertTrun
192d0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
192e0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
192f0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
19300 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
19310 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
19320 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
19330 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
19340 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
19350 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
19360 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19370 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
19380 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
19390 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
193a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
193b0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
193c0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
193d0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
193e0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
193f0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19400 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
19410 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
19420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19430 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
19440 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
19450 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
19460 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19470 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
19480 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19490 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
194a0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
194b0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
194c0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
194d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
194e0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
194f0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19500 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
19510 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
19520 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19530 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
19540 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
19550 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
19560 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19570 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
19580 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
19590 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
195a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
195b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
195c0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
195d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
195e0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
195f0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19600 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
19610 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
19620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19630 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
19640 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
19650 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
19660 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19670 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
19680 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
19690 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
196a0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
196b0 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
196c0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
196d0 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
196e0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
196f0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19700 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
19710 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
19720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19730 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
19740 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
19750 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
19760 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19770 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19780 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19790 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
197a0 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
197b0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
197c0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
197d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
197e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
197f0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19800 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19810 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
19820 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
19830 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
19840 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
19850 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
19860 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19870 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19880 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19890 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
198a0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
198b0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
198c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
198d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
198e0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
198f0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
19900 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
19910 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
19920 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
19930 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19940 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
19950 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
19960 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
19970 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
19980 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
19990 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
199a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
199b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
199c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
199d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
199e0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
199f0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
19a00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19a10 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
19a20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
19a30 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
19a40 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
19a50 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
19a60 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
19a70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
19a80 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
19a90 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
19aa0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
19ab0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
19ac0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
19ad0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
19ae0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
19af0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
19b00 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19b10 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
19b20 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
19b30 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
19b40 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
19b50 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
19b60 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
19b70 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
19b80 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
19b90 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
19ba0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
19bb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
19bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
19bd0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
19be0 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e  is not set, then
19bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19c00 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
19c10 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
19c20 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
19c30 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
19c40 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20  nal-mode.** and 
19c50 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
19c60 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
19c70 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
19c80 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
19c90 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19cb0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
19cc0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
19cd0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
19ce0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
19cf0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
19d00 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
19d10 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
19d20 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
19d30 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
19d40 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
19d50 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
19d60 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
19d70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
19d80 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
19d90 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
19da0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
19db0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
19dc0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
19dd0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
19de0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
19df0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
19e00 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
19e10 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
19e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19e30 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
19e40 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
19e50 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
19e60 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
19e70 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19e80 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
19e90 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
19ea0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
19eb0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
19ec0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
19ed0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
19ee0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
19ef0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
19f00 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
19f10 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
19f20 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
19f30 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
19f40 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
19f50 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
19f60 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
19f70 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
19f80 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
19f90 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
19fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
19fb0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65  **   }.**.** The
19fc0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
19fd0 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62 65  flag is never be
19fe0 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61   set for tempora
19ff0 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79  ry files, or any
1a000 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69  .** file operati
1a010 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1a020 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63  de (Pager.noSync
1a030 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f   set to non-zero
1a040 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  )..**.** If succ
1a050 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
1a060 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
1a070 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1a080 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
1a090 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
1a0a0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
1a0b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a0c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a0d0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
1a0e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1a0f0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1a100 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a110 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
1a130 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
1a140 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a150 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1a160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a170 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1a180 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1a190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1a1a0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1a1b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
1a1c0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a1f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20  rn code */.     
1a200 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
1a210 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1a220 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a230 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1a240 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1a250 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1a260 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
1a270 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1a280 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1a290 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1a2a0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
1a2b0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
1a2c0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
1a2d0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
1a2e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
1a2f0 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
1a300 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
1a310 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
1a320 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
1a330 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
1a340 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a350 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
1a360 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
1a370 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
1a380 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
1a390 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
1a3a0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
1a3b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
1a3c0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
1a3d0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
1a3e0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
1a3f0 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
1a400 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a410 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
1a420 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ions transaction
1a430 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
1a440 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
1a450 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
1a460 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
1a470 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
1a480 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
1a490 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
1a4a0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
1a4b0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
1a4c0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
1a4d0 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
1a4e0 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
1a4f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
1a500 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
1a510 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
1a520 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
1a530 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
1a540 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
1a550 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
1a560 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
1a570 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
1a580 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
1a590 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
1a5a0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
1a5b0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
1a5c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
1a5d0 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
1a5e0 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
1a5f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1a600 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
1a610 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
1a620 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
1a630 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a640 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
1a650 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
1a660 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
1a670 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
1a680 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
1a690 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
1a6a0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
1a6b0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
1a6c0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
1a6d0 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
1a6e0 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
1a6f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1a700 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
1a710 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
1a720 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
1a730 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
1a740 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
1a750 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
1a760 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
1a770 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
1a780 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
1a790 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
1a7a0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
1a7b0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
1a7c0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
1a7d0 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
1a7e0 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
1a7f0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
1a800 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
1a810 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
1a820 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
1a830 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b 73 69  ;..u8 zHeader[si
1a840 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1a850 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70 79  ic)+4];...memcpy
1a860 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
1a870 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
1a880 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
1a890 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a 48 65  ..put32bits(&zHe
1a8a0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1a8b0 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
1a8c0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
1a8d0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
1a8e0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1a8f0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1a900 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a910 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1a920 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1a930 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1a940 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1a950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a960 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1a970 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1a980 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1a990 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a9a0 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1a9b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a9c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a9d0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1a9e0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1a9f0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1aa00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1aa10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1aa20 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1aa30 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1aa40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1aa50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1aa60 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1aa70 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1aa80 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1aa90 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1aaa0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1aab0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1aac0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1aad0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1aae0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1aaf0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1ab00 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1ab10 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1ab20 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1ab30 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1ab40 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1ab50 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1ab60 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1ab70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1ab80 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ab90 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1aba0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1abb0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1abc0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1abd0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1abe0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1abf0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1ac00 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1ac10 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1ac20 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1ac30 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1ac40 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1ac50 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1ac60 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1ac70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ac80 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1ac90 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1aca0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1acb0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1acc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1acd0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1ace0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1acf0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1ad00 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1ad10 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1ad20 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1ad30 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1ad40 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1ad50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1ad60 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1ad70 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1ad80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1ad90 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1ada0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1adb0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1adc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1add0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ade0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1adf0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1ae00 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
1ae10 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
1ae20 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
1ae30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1ae40 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
1ae50 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
1ae60 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1ae70 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
1ae80 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29 3b 0a  >journalHdr..);.
1ae90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1aea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1aeb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1aec0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1aed0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1aee0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1aef0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1af00 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1af10 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1af20 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1af30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1af40 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1af50 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
1af60 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1af70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1af80 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
1af90 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
1afa0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
1afb0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1afc0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
1afd0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
1afe0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1aff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b010 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b020 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b030 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63 65  e was just succe
1b040 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
1b050 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79  Set Pager.needSy
1b060 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65  nc .    ** to ze
1b070 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  ro and clear the
1b080 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1b090 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67   flag on all pag
1b0a0 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
1b0b0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b0c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b0d0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1b0e0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b0f0 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1b100 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1b110 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1b120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1b140 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1b150 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1b160 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1b170 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1b180 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1b190 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1b1a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1b1b0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1b1c0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1b1d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1b1e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b1f0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1b200 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1b210 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1b220 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1b230 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1b250 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1b260 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1b270 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1b280 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1b290 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b2a0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1b2b0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1b2c0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1b2d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1b2e0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1b2f0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1b300 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1b310 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1b320 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1b330 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b340 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1b350 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1b360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b370 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1b380 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1b390 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1b3a0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1b3b0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1b3c0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1b3d0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1b3e0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1b3f0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1b400 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1b410 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1b420 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1b430 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1b440 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1b450 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1b460 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1b470 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1b480 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1b490 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1b4a0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1b4b0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1b4c0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1b4d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1b4e0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1b4f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b500 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1b510 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1b520 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1b530 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1b540 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1b550 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1b560 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1b570 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1b580 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1b590 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1b5a0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1b5b0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1b5c0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1b5d0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1b5e0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1b5f0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1b600 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1b610 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1b620 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1b630 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1b640 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1b650 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1b660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1b670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b680 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1b690 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1b6a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1b6b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1b6c0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1b6d0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1b6e0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1b6f0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b700 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1b710 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1b720 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1b730 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1b740 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b760 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1b770 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b7a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1b7b0 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1b7c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1b7d0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1b7e0 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1b7f0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1b800 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1b810 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1b820 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1b830 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1b840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b850 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1b860 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1b870 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1b880 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1b890 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1b8a0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1b8b0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1b8c0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1b8d0 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1b8e0 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1b8f0 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1b900 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1b910 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1b920 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1b930 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1b940 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1b950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1b960 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1b970 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1b980 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1b990 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1b9a0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1b9b0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1b9c0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1b9d0 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1b9e0 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1b9f0 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1ba00 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1ba10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1ba20 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1ba30 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1ba40 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1ba50 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1ba60 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1ba70 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1ba80 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1ba90 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1baa0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1bab0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1bac0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1bad0 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1bae0 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1baf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bb00 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1bb10 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1bb20 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1bb30 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1bb40 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1bb50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bb60 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1bb70 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20  ESERVED );.  rc 
1bb80 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1bb90 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1bba0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20  LUSIVE_LOCK);.. 
1bbb0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1bbc0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
1bbd0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1bbe0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
1bbf0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
1bc00 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1bc10 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
1bc20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
1bc30 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
1bc40 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
1bc50 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1bc60 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1bc70 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
1bc80 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
1bc90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1bca0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1bcb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
1bcc0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1bcd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1bce0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
1bcf0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
1bd00 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
1bd10 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1bd20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bd30 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
1bd40 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
1bd50 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
1bd60 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
1bd70 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
1bd80 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
1bd90 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1bda0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
1bdb0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
1bdc0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
1bdd0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1bde0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
1bdf0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
1be00 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
1be10 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
1be20 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
1be30 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
1be40 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
1be50 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
1be60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1be70 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
1be80 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
1be90 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
1bea0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1beb0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
1bec0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
1bed0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 20 20  rDontWrite()).  
1bee0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 63 6f 6d  Note that if com
1bef0 70 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a  piled with.    *
1bf00 2a 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  * SQLITE_SECURE_
1bf10 44 45 4c 45 54 45 20 74 68 65 20 50 47 48 44 52  DELETE the PGHDR
1bf20 5f 44 4f 4e 54 5f 57 52 49 54 45 20 62 69 74 20  _DONT_WRITE bit 
1bf30 69 73 20 6e 65 76 65 72 20 73 65 74 20 61 6e 64  is never set and
1bf40 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   so.    ** the s
1bf50 65 63 6f 6e 64 20 74 65 73 74 20 69 73 20 61 6c  econd test is al
1bf60 77 61 79 73 20 74 72 75 65 2e 0a 20 20 20 20 2a  ways true..    *
1bf70 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1bf80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1bf90 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1bfa0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1bfb0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1bfc0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1bfd0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1bfe0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1bff0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c000 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c010 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1c040 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1c050 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1c060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1c070 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1c080 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c090 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1c0a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c0b0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1c0c0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1c0d0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1c0e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c0f0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c100 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1c110 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c120 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1c130 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1c140 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1c150 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1c160 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1c170 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1c180 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1c190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c1a0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1c1b0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1c1c0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1c1d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1c1e0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1c1f0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1c200 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1c210 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1c220 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c230 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1c240 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1c250 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c270 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1c280 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1c290 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c2a0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1c2b0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1c2c0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1c2d0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1c2e0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1c2f0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1c300 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1c310 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1c320 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1c330 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1c340 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1c350 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1c360 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1c370 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c3a0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1c3b0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1c3c0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1c3d0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1c3e0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1c3f0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c400 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c410 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1c420 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c430 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1c440 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c450 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c460 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1c470 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c480 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1c490 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1c4a0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1c4b0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1c4c0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1c4d0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1c4e0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1c4f0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1c500 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c520 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1c530 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1c540 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1c550 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1c560 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1c570 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1c580 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1c590 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1c5a0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1c5b0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1c5c0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1c5d0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1c5e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1c5f0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1c600 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1c610 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1c620 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1c630 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1c640 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1c650 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1c660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c670 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c680 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1c690 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1c6a0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1c6b0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1c6c0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1c6d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1c6e0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1c6f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1c700 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1c710 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1c720 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1c730 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1c740 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1c750 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1c760 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1c770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c780 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c790 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1c7a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1c7b0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1c7c0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1c7d0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1c7e0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1c7f0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1c800 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c810 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1c820 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1c830 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1c840 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1c850 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1c860 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1c870 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1c880 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1c890 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c8a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1c8b0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1c8c0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1c8d0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1c8e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1c8f0 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1c900 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1c910 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1c920 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c940 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1c950 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1c960 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1c970 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1c980 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1c990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1c9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c9b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1c9c0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1c9d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1c9e0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1c9f0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1ca00 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1ca10 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1ca20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ca30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1ca40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ca50 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
1ca60 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
1ca70 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
1ca80 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
1ca90 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
1caa0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1cab0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
1cac0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
1cad0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
1cae0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
1caf0 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
1cb00 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
1cb10 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
1cb20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1cb30 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
1cb40 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
1cb50 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
1cb60 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
1cb70 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1cb80 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
1cb90 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
1cba0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1cbb0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
1cbc0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1cbd0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
1cbe0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
1cbf0 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
1cc00 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
1cc10 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
1cc20 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
1cc30 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
1cc40 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
1cc50 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
1cc60 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
1cc70 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
1cc80 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
1cc90 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
1cca0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
1ccb0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
1ccc0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
1ccd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
1cce0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
1ccf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1cd00 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
1cd10 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
1cd20 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
1cd30 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1cd40 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
1cd50 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
1cd60 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
1cd70 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
1cd80 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1cd90 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
1cda0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
1cdb0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
1cdc0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
1cdd0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
1cde0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1cdf0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
1ce00 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
1ce10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1ce20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
1ce30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ce40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1ce50 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
1ce60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ce70 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
1ce80 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
1ce90 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1cea0 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73   is set by the s
1ceb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cec0 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  () function whil
1ced0 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75  e it.  ** is jou
1cee0 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f  rnalling a set o
1cef0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61  f two or more da
1cf00 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61  tabase pages tha
1cf10 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a  t are stored.  *
1cf20 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69  * on the same di
1cf30 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69  sk sector. Synci
1cf40 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ng the journal i
1cf50 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68  s not allowed wh
1cf60 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73  ile.  ** this is
1cf70 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74   happening as it
1cf80 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1cf90 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  at all members o
1cfa0 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65  f such a.  ** se
1cfb0 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
1cfc0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
1cfd0 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
1cfe0 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
1cff0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72  ction.  ** is tr
1d000 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65  ying to make cle
1d010 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  an will require 
1d020 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61  a journal sync a
1d030 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  nd the doNotSync
1d040 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65  .  ** flag is se
1d050 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  t, return withou
1d060 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
1d070 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79  . The pcache lay
1d080 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73  er will.  ** jus
1d090 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65  t have to go ahe
1d0a0 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ad and allocate 
1d0b0 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65  a new page buffe
1d0c0 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a  r instead of.  *
1d0d0 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20  * reusing pPg.. 
1d0e0 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72   **.  ** Similar
1d0f0 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72  ly, if the pager
1d100 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
1d110 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
1d120 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a  tate, do not.  *
1d130 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74  * try to write t
1d140 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
1d150 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f  Pg to disk..  */
1d160 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
1d170 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20  ger->errCode).  
1d180 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e   || (pPager->doN
1d190 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66  otSync && pPg->f
1d1a0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d1b0 53 59 4e 43 29 0a 20 20 29 7b 0a 20 20 20 20 72  SYNC).  ){.    r
1d1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  .  }..  /* Sync 
1d1e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d1f0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
1d200 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
1d210 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1d220 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79  C ){.    rc = sy
1d230 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1d240 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1d260 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1d270 0a 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d  .      !(pPager-
1d280 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
1d290 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1d2a0 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20  MEMORY) &&.     
1d2b0 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
1d2c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1d2d0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
1d2e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1d2f0 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20  APPEND).    ){. 
1d300 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1d310 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  c = 0;.      rc 
1d320 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1d330 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1d340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1d350 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1d360 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
1d370 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
1d380 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
1d390 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1d3a0 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
1d3b0 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
1d3c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1d3d0 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  nal..  ** This i
1d3e0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
1d3f0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
1d400 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
1d410 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  ow will not.  **
1d420 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
1d430 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
1d440 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1d450 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65   **.  ** Conside
1d460 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1d470 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
1d480 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ts:.  **.  **   
1d490 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
1d4a0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
1d4b0 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66  .  **     <modif
1d4c0 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20  y page X>.  **  
1d4d0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
1d4e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72  .  **       <shr
1d4f0 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
1d500 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
1d510 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
1d520 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a  ress(page X).  *
1d530 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
1d540 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  O sp;.  **.  ** 
1d550 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
1d560 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
1d570 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
1d580 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
1d590 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  tten.  ** out to
1d5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d5b0 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
1d5c0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
1d5d0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
1d5e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
1d5f0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
1d600 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
1d610 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
1d620 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20   read.  ** data 
1d630 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d640 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
1d650 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
1d660 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
1d670 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
1d680 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
1d690 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
1d6a0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
1d6b0 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20  NT sp".  ** was 
1d6c0 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20  executed..  **. 
1d6d0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
1d6e0 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
1d6f0 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
1d700 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
1d710 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
1d720 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
1d730 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1d740 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
1d750 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  at it will.  ** 
1d760 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
1d770 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
1d780 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
1d790 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
1d7a0 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
1d7b0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 0a  */.  if( NEVER(.
1d7c0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1d7d0 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
1d7e0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
1d7f0 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
1d800 61 67 65 28 70 50 67 29 0a 20 20 29 20 29 7b 0a  age(pPg).  ) ){.
1d810 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
1d820 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
1d830 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
1d840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1d850 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
1d860 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d870 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1d880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1d890 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1d8a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1d8b0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1d8c0 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  g);.  }..  /* Ma
1d8d0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1d8e0 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
1d8f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d900 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1d910 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
1d920 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1d930 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1d940 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
1d950 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1d960 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
1d970 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1d980 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1d990 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1d9a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
1d9b0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
1d9c0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
1d9d0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
1d9e0 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
1d9f0 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
1da00 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
1da10 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
1da20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1da30 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
1da40 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1da50 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
1da60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1da70 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
1da80 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
1da90 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
1daa0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
1dab0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
1dac0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
1dad0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
1dae0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
1daf0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
1db00 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
1db10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
1db20 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
1db30 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
1db40 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
1db50 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
1db60 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
1db70 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
1db80 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
1db90 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
1dba0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
1dbb0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
1dbc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
1dbd0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
1dbe0 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
1dbf0 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
1dc00 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1dc10 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
1dc20 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
1dc30 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
1dc40 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
1dc50 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
1dc60 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
1dc70 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
1dc80 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
1dc90 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
1dca0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
1dcb0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
1dcc0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
1dcd0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
1dce0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
1dcf0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
1dd00 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
1dd10 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
1dd20 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  e PAGER_OMIT_JOU
1dd30 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e  RNAL and PAGER_N
1dd40 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73  O_READLOCK flags
1dd50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
1dd60 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
1dd70 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
1dd80 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
1dd90 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
1dda0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
1ddb0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
1ddc0 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
1ddd0 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
1dde0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1ddf0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
1de00 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
1de10 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
1de20 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
1de30 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
1de40 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1de50 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
1de60 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
1de70 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
1de80 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1de90 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
1dea0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
1deb0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
1dec0 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
1ded0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
1dee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1def0 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
1df00 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
1df10 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
1df20 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
1df30 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
1df40 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
1df50 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
1df60 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
1df70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1df80 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
1df90 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
1dfa0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
1dfb0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
1dfc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1dfd0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
1dfe0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
1dff0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1e000 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
1e010 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1e020 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
1e030 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
1e040 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
1e050 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
1e060 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
1e070 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
1e080 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
1e090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e0a0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
1e0b0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1e0c0 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
1e0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
1e0e0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
1e0f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
1e100 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
1e110 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
1e120 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
1e130 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
1e140 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
1e150 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
1e160 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
1e170 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e180 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
1e190 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
1e1a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e1b0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
1e1c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e1d0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
1e1e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1e1f0 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
1e200 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
1e210 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
1e220 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
1e230 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1e240 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1e250 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
1e260 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
1e270 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e280 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
1e290 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
1e2a0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
1e2b0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
1e2c0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
1e2d0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
1e2e0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
1e2f0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
1e300 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
1e310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e320 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
1e330 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1e340 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1e350 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
1e360 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
1e370 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
1e380 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
1e390 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
1e3a0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
1e3b0 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
1e3c0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
1e3d0 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
1e3e0 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d  ;  /* True to om
1e3f0 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  it read-lock */.
1e400 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
1e410 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e420 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
1e430 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
1e440 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
1e450 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c  .  u16 szPageDfl
1e460 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
1e470 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
1e480 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
1e490 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ize */..  /* Fig
1e4a0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
1e4b0 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
1e4c0 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
1e4d0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
1e4e0 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
1e4f0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
1e500 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
1e510 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
1e520 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
1e530 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
1e540 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
1e550 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
1e560 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1e570 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
1e580 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
1e590 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
1e5a0 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
1e5b0 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
1e5c0 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
1e5d0 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
1e5e0 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
1e5f0 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
1e600 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
1e610 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
1e620 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
1e630 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
1e640 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
1e650 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
1e660 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
1e670 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
1e680 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
1e690 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1e6a0 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
1e6b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
1e6c0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
1e6d0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
1e6e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
1e6f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1e700 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
1e710 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
1e720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1e730 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
1e740 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
1e750 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
1e760 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
1e770 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
1e780 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
1e790 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1e7a0 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
1e7b0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
1e7c0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
1e7d0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
1e7e0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
1e7f0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
1e800 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
1e810 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
1e820 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
1e830 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
1e840 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1e850 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
1e860 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   ){.    nPathnam
1e870 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
1e880 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
1e890 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
1e8a0 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a  alloc(nPathname*
1e8b0 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
1e8c0 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
1e8d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66  NOMEM;.    }.#if
1e8f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e900 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
1e910 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
1e920 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
1e930 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
1e940 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
1e950 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
1e960 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1e970 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68     {.      zPath
1e980 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
1e990 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
1e9a0 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
1e9b0 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
1e9c0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ls */.      rc =
1e9d0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
1e9e0 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
1e9f0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
1ea00 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
1ea10 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e     }..    nPathn
1ea20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1ea30 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
1ea40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ea50 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
1ea60 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
1ea70 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
1ea80 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
1ea90 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
1eaa0 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
1eab0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
1eac0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1ead0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
1eae0 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
1eaf0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1eb00 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
1eb10 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
1eb20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1eb30 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
1eb40 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
1eb50 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
1eb60 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
1eb70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1eb80 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
1eb90 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
1eba0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
1ebb0 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
1ebc0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
1ebd0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
1ebe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1ebf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ec00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ec10 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1ec20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ec30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
1ec40 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
1ec50 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
1ec60 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
1ec70 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
1ec80 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
1ec90 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
1eca0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
1ecb0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
1ecc0 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
1ecd0 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
1ece0 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
1ecf0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1ed00 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
1ed30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ed40 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
1ed70 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
1ed80 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
1ed90 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
1eda0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
1edb0 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
1edc0 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
1edd0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
1ede0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
1edf0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
1ee00 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
1ee10 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1ee20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1ee30 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1ee40 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1ee50 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1ee60 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1ee70 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
1ee80 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
1ee90 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1eea0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
1eeb0 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
1eec0 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
1eed0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1eee0 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
1eef0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
1ef00 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
1ef10 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
1ef20 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
1ef30 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
1ef40 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
1ef50 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
1ef60 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
1ef70 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1ef80 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
1ef90 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1efa0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
1efb0 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
1efc0 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
1efd0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eff0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
1f000 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
1f010 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
1f020 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
1f030 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
1f040 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1f050 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
1f060 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
1f070 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
1f080 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
1f090 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f0a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
1f0b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f0c0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
1f0e0 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
1f0f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
1f100 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
1f110 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
1f120 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
1f130 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
1f140 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f150 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f160 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
1f170 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
1f180 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
1f190 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
1f1a0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
1f1b0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
1f1c0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f1d0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
1f1e0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
1f1f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
1f200 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
1f210 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
1f220 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
1f230 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1f240 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
1f250 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
1f260 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
1f270 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
1f280 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
1f290 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
1f2a0 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
1f2b0 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  me ){.    pPager
1f2c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
1f2d0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
1f2e0 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20  Pathname + 1);. 
1f2f0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
1f300 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
1f310 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
1f320 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
1f330 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1f340 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f350 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f360 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
1f370 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
1f380 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b   "-journal", 8);
1f390 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1f3a0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  >zFilename[0]==0
1f3b0 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72   ) pPager->zJour
1f3c0 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  nal[0] = 0;.    
1f3d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
1f3e0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
1f3f0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
1f400 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
1f410 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
1f420 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
1f430 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
1f440 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1f450 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1f460 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
1f470 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
1f480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f490 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
1f4a0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
1f4b0 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
1f4c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1f4d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
1f4e0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
1f4f0 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
1f500 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
1f510 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
1f520 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1f530 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1f540 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
1f550 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
1f560 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
1f570 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
1f580 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
1f590 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
1f5a0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
1f5b0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1f5c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1f5d0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
1f5e0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
1f5f0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
1f600 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
1f610 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f620 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
1f630 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1f640 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
1f650 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1f660 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
1f670 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
1f680 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1f690 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
1f6a0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1f6b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
1f6c0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
1f6d0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1f6e0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
1f6f0 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
1f700 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
1f710 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f720 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
1f730 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
1f740 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
1f750 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1f760 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
1f770 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
1f780 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f790 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
1f7a0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1f7b0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f7c0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
1f7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f7e0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f7f0 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
1f800 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
1f810 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
1f820 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1f830 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1f840 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
1f850 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
1f860 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1f870 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1f880 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
1f890 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
1f8a0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
1f8b0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
1f8c0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
1f8d0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1f8e0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
1f8f0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
1f900 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f910 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f920 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
1f930 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
1f940 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
1f950 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
1f960 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
1f970 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
1f980 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
1f990 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
1f9a0 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
1f9b0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
1f9c0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
1f9d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1f9e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1f9f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1fa00 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
1fa10 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
1fa20 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
1fa30 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
1fa40 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
1fa50 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
1fa60 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
1fa70 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
1fa80 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
1fa90 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
1faa0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
1fab0 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
1fac0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
1fad0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
1fae0 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
1faf0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1fb00 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
1fb10 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1fb20 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1fb30 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
1fb40 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
1fb50 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
1fb60 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
1fb70 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
1fb80 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
1fb90 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
1fba0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
1fbb0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1fbc0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1fbd0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
1fbe0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
1fbf0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
1fc00 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1fc10 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
1fc20 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
1fc30 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
1fc40 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
1fc50 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
1fc60 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
1fc70 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
1fc80 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
1fc90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1fcb0 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
1fcc0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1fcd0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1fce0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
1fcf0 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
1fd00 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fd10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1fd20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
1fd30 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
1fd40 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
1fd50 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
1fd60 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
1fd70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
1fd80 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
1fd90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
1fda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fdb0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1fdc0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
1fdd0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1fde0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
1fdf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1fe00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
1fe10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1fe20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1fe30 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
1fe40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
1fe50 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
1fe60 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
1fe70 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
1fe80 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
1fe90 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
1fea0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
1fec0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
1fed0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1fee0 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
1fef0 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
1ff00 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
1ff10 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
1ff20 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
1ff30 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
1ff40 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
1ff50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
1ff60 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
1ff70 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
1ff80 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
1ff90 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
1ffa0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
1ffb0 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c  dlock = (noReadl
1ffc0 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29  ock && readOnly)
1ffd0 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67   ?1:0;.  /* pPag
1ffe0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
1fff0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20000 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
20010 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20020 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
20030 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
20040 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  lid = (u8)memDb;
20050 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20060 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
20070 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
20080 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
20090 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
200a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
200b0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
200c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
200d0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
200e0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
200f0 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
20100 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
20110 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
20120 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
20130 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
20140 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
20150 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
20160 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
20170 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
20180 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
20190 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
201a0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
201b0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
201c0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
201d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
201e0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
201f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
20200 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
20210 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
20220 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
20230 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
20240 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
20250 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
20260 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
20270 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
20280 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
20290 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
202a0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
202b0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
202c0 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  = 0; */.  assert
202d0 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
202e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
202f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
20300 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
20310 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
20320 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
20330 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
20340 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
20350 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
20360 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
20370 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
20380 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
20390 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
203a0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
203b0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
203c0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
203d0 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
203e0 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
203f0 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
20400 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
20410 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
20420 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
20430 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
20440 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
20450 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
20460 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
20470 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
20480 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20490 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
204a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
204b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
204c0 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
204d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
204e0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
204f0 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
20500 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
20510 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
20520 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
20530 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
20540 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20550 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
20560 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
20570 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
20580 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
20590 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
205a0 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
205b0 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
205c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
205d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
205e0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
205f0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
20600 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
20610 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
20620 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
20630 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
20640 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
20650 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
20660 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
20670 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
20680 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
20690 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
206a0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
206b0 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
206c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
206d0 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
206e0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
206f0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20700 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
20710 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
20720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
20730 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
20740 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
20750 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
20760 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
20770 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
20780 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20790 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
207a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
207b0 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
207c0 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
207d0 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
207e0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
207f0 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
20800 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20810 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
20820 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
20830 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
20840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20850 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
20860 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
20870 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
20880 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
20890 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
208a0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
208b0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
208c0 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
208d0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
208e0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
208f0 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
20900 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
20910 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
20920 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
20930 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
20940 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20950 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
20960 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
20970 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20980 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
20990 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
209a0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
209b0 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
209c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
209d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
209e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
209f0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
20a00 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
20a10 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
20a20 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
20a30 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
20a40 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
20a50 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
20a60 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
20a70 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20a80 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
20a90 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
20aa0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
20ab0 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
20ac0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20ad0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
20ae0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
20af0 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
20b00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
20b10 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
20b20 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20b30 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
20b40 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
20b50 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
20b60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
20b70 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
20b80 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
20b90 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
20ba0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
20bb0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
20bc0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
20bd0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
20be0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20bf0 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
20c00 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
20c10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
20c20 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
20c30 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20c40 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
20c50 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
20c60 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
20c70 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20ca0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
20cb0 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
20cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20cd0 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
20ce0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
20cf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20d00 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
20d10 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
20d20 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
20d30 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20d40 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20d50 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
20d60 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65  ->jfd) );.  asse
20d70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
20d80 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
20d90 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73  D );..  *pExists
20da0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
20db0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
20dc0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
20dd0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
20de0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
20df0 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
20e00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
20e10 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
20e20 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  cked;           
20e30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20e40 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
20e50 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
20e60 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
20e70 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
20e80 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
20e90 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
20ea0 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
20eb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
20ec0 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
20ed0 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
20ee0 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
20ef0 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
20f00 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
20f10 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
20f20 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
20f30 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
20f40 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
20f50 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
20f60 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
20f70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
20f80 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
20f90 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
20fa0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
20fb0 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
20fc0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
20fd0 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
20fe0 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
20ff0 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
21000 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
21010 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
21020 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
21030 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
21040 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
21050 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
21060 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
21070 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
21080 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
21090 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
210a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
210b0 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
210c0 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
210d0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Page;..      /* 
210e0 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
210f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21100 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
21110 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
21120 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
21130 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
21140 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
21150 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
21160 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
21170 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
21180 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
21190 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
211a0 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
211b0 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
211c0 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
211d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
211e0 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
211f0 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
21200 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
21210 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
21220 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
21230 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
21240 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
21250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21260 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
21270 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21280 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
21290 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
212a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
212b0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
212c0 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
212d0 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
212e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
212f0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
21300 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21310 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
21320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21330 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
21340 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
21350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
21370 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
21380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
213a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
213b0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
213c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
213d0 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
213e0 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
213f0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
21400 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
21410 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
21420 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
21430 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
21440 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
21450 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21470 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
21480 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
21490 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
214a0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
214b0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
214c0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
214d0 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
214e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
214f0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
21500 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21510 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
21520 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
21530 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21540 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
21550 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21560 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
21570 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
21580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21590 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
215a0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
215b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
215c0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
215d0 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
215e0 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
215f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21610 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
21630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21640 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21650 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21660 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
21670 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
21680 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
21690 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
216a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
216b0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
216c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
216d0 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
216e0 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
216f0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
21700 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
21710 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
21720 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
21730 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
21740 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
21750 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
21760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21770 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
21780 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
21790 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
217a0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
217b0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
217c0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
217d0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
217e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
217f0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
21800 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
21810 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
21820 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
21830 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
21840 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
21850 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
21860 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
21870 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
21880 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
21890 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
218a0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
218b0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
218c0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
218d0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
218e0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
218f0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
21900 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21910 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21920 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
21930 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21940 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
21950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21960 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21980 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
21990 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
219a0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
219b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
219c0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
219d0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
219e0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
219f0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
21a00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
21a10 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
21a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21a30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
21a40 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
21a50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
21a60 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
21a70 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
21a80 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
21a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21aa0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
21ab0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
21ac0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
21ad0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
21ae0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
21af0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
21b00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21b10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21b20 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
21b30 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
21b40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21b50 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
21b60 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
21b70 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
21b80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
21b90 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
21ba0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
21bb0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
21bc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21be0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21bf0 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c10 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
21c20 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
21c30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21c40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21c50 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
21c60 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
21c70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21c80 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  >fd) );..  if( N
21c90 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61  EVER(!isOpen(pPa
21ca0 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
21cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21cc0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
21cd0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
21ce0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
21cf0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65  ageSize);.    re
21d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21d10 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20 3d 20    }.  iOffset = 
21d20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
21d30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
21d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21d50 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
21d60 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
21d70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
21d80 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
21d90 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
21da0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
21db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21dc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
21dd0 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38 20 2a 64  ==1 ){.    u8 *d
21de0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
21df0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
21e00 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  4];.    memcpy(&
21e10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
21e20 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
21e30 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
21e40 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
21e50 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
21e60 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
21e70 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
21e80 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
21e90 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
21ea0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
21eb0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
21ec0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
21ed0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
21ee0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
21ef0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
21f00 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
21f10 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
21f20 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
21f30 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
21f40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
21f50 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
21f60 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
21f70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21f80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21f90 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
21fa0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
21fb0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21fc0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
21fd0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
21fe0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
21ff0 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
22000 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
22010 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
22020 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
22030 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
22040 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
22050 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
22060 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22070 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
22080 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
22090 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
220a0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
220b0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
220c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
220d0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
220e0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
220f0 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
22100 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
22110 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
22120 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
22130 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
22140 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
22150 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
22160 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22170 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
22180 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
22190 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
221a0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
221b0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
221c0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
221d0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
221e0 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
221f0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
22200 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
22210 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
22220 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
22230 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
22240 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
22250 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
22260 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
22270 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
22280 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
22290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
222a0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
222b0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
222c0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
222d0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
222e0 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
222f0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
22300 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
22310 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
22320 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
22330 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
22340 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
22350 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
22360 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
22370 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
22380 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
22390 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
223a0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
223b0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
223c0 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
223d0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
223e0 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
223f0 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
22400 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
22410 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
22420 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
22430 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
22440 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
22450 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
22460 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
22470 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
22480 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
22490 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
224a0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
224b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
224c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
224d0 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
224e0 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
224f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
22500 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
22510 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
22520 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22530 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
22540 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
22550 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22560 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
22570 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
22580 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
22590 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
225a0 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
225b0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
225c0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
225d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
225e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
225f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
22600 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
22610 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
22620 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
22630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22650 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22660 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
22670 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
22680 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22690 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
226a0 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
226b0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
226c0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
226d0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
226e0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
226f0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
22700 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a  standing pages *
22710 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
22720 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
22730 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22740 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  e)==0 );.  if( N
22750 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
22760 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
22770 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
22780 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f  >errCode; }..  /
22790 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
227a0 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  se is in an erro
227b0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
227c0 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  a chance to clea
227d0 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
227e0 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
227f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22800 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f  ger-cache and ro
22810 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20  llback.  ** any 
22820 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74  hot journal in t
22830 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
22840 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
22850 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
22860 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
22870 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
22880 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b  ger->zJournal ){
22890 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65  .      isErrorRe
228a0 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  set = 1;.    }. 
228b0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
228c0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
228d0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
228e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
228f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
22900 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
22910 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
22920 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
22930 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
22940 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
22950 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
22960 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
22970 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
22980 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22990 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
229a0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
229b0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
229c0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
229d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ock ){.      ass
229e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
229f0 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70  dOnly );.      p
22a00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
22a10 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
22a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
22a30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
22a40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
22a50 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
22a60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
22a80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22a90 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
22aa0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
22ab0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
22ac0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
22ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22ae0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22af0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
22b00 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
22b10 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22b20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
22b30 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
22b40 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
22b50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
22b60 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
22b70 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
22b80 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
22b90 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
22ba0 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
22bb0 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  et ){.      asse
22bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
22bd0 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
22be0 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  D );.      rc = 
22bf0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
22c00 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
22c10 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
22c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22c30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
22c40 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
22c50 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
22c60 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
22c70 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
22c80 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
22c90 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22ca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22cb0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
22cc0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
22cd0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
22ce0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
22cf0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
22d00 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
22d10 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
22d20 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
22d30 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
22d40 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
22d50 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
22d60 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
22d70 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
22d80 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
22d90 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
22da0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
22db0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
22dc0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
22dd0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
22de0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
22df0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
22e00 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
22e10 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
22e20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
22e30 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
22e40 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
22e50 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
22e60 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
22e70 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
22e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
22e90 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
22ea0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
22eb0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
22ec0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
22ed0 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
22ee0 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
22ef0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22f00 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
22f10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
22f20 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
22f30 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
22f40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
22f50 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
22f60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
22f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
22f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
22fa0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22fb0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
22fc0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
22fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
22fe0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
22ff0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
23000 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
23010 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
23020 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
23030 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
23040 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
23050 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
23060 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
23070 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
23080 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
23090 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
230a0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
230b0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
230c0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
230d0 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
230e0 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
230f0 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
23100 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
23110 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
23120 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
23130 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
23140 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
23150 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
23160 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23170 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
23180 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
23190 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
231a0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
231b0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
231c0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
231d0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
231e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
231f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
23200 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
23210 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
23220 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23230 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
23240 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
23250 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23260 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
23270 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
23280 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
23290 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
232a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
232b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
232c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
232d0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
232e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
232f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23300 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
23310 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
23320 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23330 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
23340 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
23350 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
23360 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23370 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
23380 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23390 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
233a0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
233b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
233c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
233d0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
233e0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
233f0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
23400 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
23410 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
23420 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
23430 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
23440 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
23450 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
23460 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
23470 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
23480 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
23490 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
234a0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
234b0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
234c0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
234d0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
234e0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
234f0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
23500 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
23510 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
23520 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
23530 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
23540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
23550 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
23560 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
23570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
235a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
235b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
235c0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ..      /* TODO:
235d0 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20 63   Why are these c
235e0 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73 20  leared here? Is 
235f0 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f  it necessary? */
23600 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23610 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
23620 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
23630 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
23640 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
23650 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
23660 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23670 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
23680 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
23690 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
236a0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
236b0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
236c0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
236d0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
236e0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
236f0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
23700 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
23710 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
23720 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
23730 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
23740 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
23750 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
23760 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ache..      */. 
23770 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
23780 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
23790 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
237a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
237b0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
237c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
237d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
237e0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
237f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
23800 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23810 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
23820 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23830 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
23840 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
23850 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
23860 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
23870 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
23880 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
23890 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
238a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50     }..    if( pP
238b0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
238c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
238d0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
238e0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
238f0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
23900 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
23910 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
23920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23930 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
23940 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
23950 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
23960 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
23970 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
23980 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
23990 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
239a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
239b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
239c0 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
239d0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
239e0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
239f0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
23a00 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
23a10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
23a20 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
23a30 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
23a40 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
23a50 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
23a60 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
23a70 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
23a80 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
23a90 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
23aa0 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
23ab0 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
23ac0 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
23ad0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
23ae0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
23af0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
23b00 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
23b10 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
23b20 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
23b30 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
23b40 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
23b50 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
23b60 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
23b70 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
23b80 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
23b90 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
23ba0 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
23bb0 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
23bc0 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
23bd0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
23be0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
23bf0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
23c00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
23c10 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
23c20 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
23c30 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
23c40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
23c50 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
23c60 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
23c70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
23c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
23c90 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
23ca0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
23cb0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
23cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23cd0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
23ce0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23cf0 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
23d00 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
23d10 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
23d20 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
23d30 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
23d40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23d50 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
23d60 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
23d70 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
23d80 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
23d90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23db0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23de0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
23df0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
23e00 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
23e10 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
23e20 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
23e30 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
23e40 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
23e50 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
23e60 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
23e70 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
23e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
23e90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
23ea0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
23eb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23ec0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
23ed0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
23ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23ef0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
23f00 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
23f10 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
23f20 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
23f30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
23f40 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
23f50 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
23f60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23f70 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
23f80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
23f90 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
23fa0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
23fb0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
23fc0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
23fd0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
23fe0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
23ff0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
24000 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
24010 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
24020 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
24030 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
24040 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
24050 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
24060 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
24070 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
24080 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
24090 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
240a0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
240b0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
240c0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
240d0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
240e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
240f0 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28  che)==0).   && (
24100 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
24110 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
24120 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
24130 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  .  ){.    pagerU
24140 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
24150 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
24160 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
24170 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
24180 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
24190 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
241a0 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
241b0 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
241c0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
241d0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
241e0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
241f0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
24200 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
24210 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
24220 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
24230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
24240 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
24250 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
24260 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
24270 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
24280 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
24290 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
242a0 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
242b0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
242c0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
242d0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
242e0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
242f0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
24300 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
24310 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
24320 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
24330 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
24340 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
24350 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
24360 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
24370 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
24380 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
24390 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
243a0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
243b0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
243c0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
243d0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
243e0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
243f0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
24400 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
24410 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
24420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24430 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
24440 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
24450 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
24460 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
24470 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
24480 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
24490 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
244a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
244b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
244c0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
244d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
244e0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
244f0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
24500 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
24510 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
24520 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
24530 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
24540 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
24550 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
24560 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
24570 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
24580 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
24590 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
245a0 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
245b0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
245c0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
245d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
245e0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
245f0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
24600 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
24610 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
24620 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
24630 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
24640 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
24650 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
24660 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
24670 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
24680 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
24690 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
246a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
246b0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
246c0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
246d0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
246e0 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 77  he to populate w
246f0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
24700 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
24710 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
24720 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
24730 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
24740 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
24750 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
24760 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
24770 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
24780 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
24790 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
247a0 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
247b0 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
247c0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
247d0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
247e0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
247f0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
24800 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
24810 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
24820 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
24830 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
24840 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
24850 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
24860 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
24870 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
24880 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
24890 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
248a0 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
248b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
248c0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
248d0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
248e0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
248f0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
24900 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
24910 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
24920 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
24930 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
24940 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
24950 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
24960 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
24970 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24980 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
24990 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
249a0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
249b0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
249c0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
249d0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
249e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
249f0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
24a00 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
24a10 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
24a20 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
24a30 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
24a40 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
24a50 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
24a60 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
24a70 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
24a80 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
24a90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
24aa0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
24ab0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
24ac0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
24ad0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
24ae0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
24af0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
24b00 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
24b10 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
24b20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
24b30 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
24b40 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
24b50 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
24b60 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
24b70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24b80 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
24b90 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
24ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24bb0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
24bc0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
24bd0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
24be0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
24bf0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
24c00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24c10 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
24c20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
24c30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
24c40 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
24c50 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
24c60 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
24c70 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
24c80 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
24c90 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
24ca0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
24cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24cc0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c  >state>PAGER_UNL
24cd0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  OCK );..  if( pg
24ce0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
24cf0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24d00 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
24d10 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
24d20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24d30 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
24d40 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
24d50 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
24d60 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
24d70 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
24d80 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
24d90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
24da0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
24db0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
24dc0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
24dd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
24de0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
24df0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
24e00 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
24e10 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
24e20 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
24e30 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
24e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24e50 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
24e60 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
24e70 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
24e80 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
24e90 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
24ea0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
24eb0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
24ec0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24ed0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
24ee0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
24ef0 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
24f00 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
24f10 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
24f20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
24f30 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
24f40 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
24f50 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
24f60 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
24f70 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
24f80 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
24f90 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
24fa0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
24fb0 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
24fc0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 2f  >pPager ){.    /
24fd0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
24fe0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
24ff0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
25000 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
25010 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
25020 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
25030 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
25040 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
25050 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
25060 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
25070 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
25080 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  r) );.    PAGER_
25090 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
250a0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
250b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
250c0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
250d0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
250e0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
250f0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
25100 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
25110 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
25120 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
25130 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  ;..    PAGER_INC
25140 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
25150 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ;.    pPg = *ppP
25160 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
25170 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
25180 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
25190 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
251a0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
251b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
251c0 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
251d0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
251e0 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
251f0 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
25200 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
25210 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
25220 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
25230 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
25240 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
25250 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25260 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25270 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
25280 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
252a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
252b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
252c0 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20  &nMax);.    if( 
252d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
252e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
252f0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
25300 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
25310 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74  MDB || nMax<(int
25320 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  )pgno || noConte
25330 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
25340 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
25350 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
25360 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09 72  er->mxPgno ){..r
25370 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
25380 0a 09 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ..goto pager_acq
25390 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
253a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
253b0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
253c0 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
253d0 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
253e0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
253f0 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
25400 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
25410 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
25420 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
25430 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
25440 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
25450 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
25460 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
25470 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
25480 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
25490 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
254a0 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
254b0 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
254c0 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
254d0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
254e0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
254f0 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
25500 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
25510 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
25520 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
25530 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
25540 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
25550 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
25560 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
25570 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
25580 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
25590 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
255a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
255b0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
255c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
255d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
255e0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
255f0 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
25600 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
25610 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
25620 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
25630 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
25640 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
25650 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
25660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
25670 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
25680 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
25690 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
256a0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
256b0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
256c0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
256d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
256e0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
256f0 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r );.      rc = 
25700 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
25710 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
25720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25730 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
25740 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
25750 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
25760 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
25770 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
25780 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
25790 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
257a0 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
257b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
257c0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
257d0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
257e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
257f0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
25800 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
25810 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
25820 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
25830 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
25840 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
25850 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
25860 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
25870 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
25880 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
25890 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
258a0 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
258b0 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
258c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
258d0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
258e0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
258f0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
25900 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
25910 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
25920 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
25930 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
25940 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25950 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
25960 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
25970 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
25980 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
25990 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
259a0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
259b0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
259c0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
259d0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
259e0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
259f0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
25a00 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
25a10 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
25a20 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
25a30 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
25a40 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
25a50 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
25a60 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
25a70 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
25a80 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
25a90 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
25aa0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
25ab0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
25ac0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
25ad0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
25ae0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
25af0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
25b00 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
25b10 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25b20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
25b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25b40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
25b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25b60 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41  ager->state > PA
25b70 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
25b80 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
25b90 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
25ba0 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
25bb0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
25bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
25bd0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
25be0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
25bf0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
25c00 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
25c10 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
25c20 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
25c30 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
25c40 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
25c50 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
25c60 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
25c70 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
25c80 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
25c90 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
25ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
25cb0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
25cc0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25cd0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
25ce0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
25cf0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
25d00 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
25d10 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
25d20 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
25d30 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
25d40 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
25d50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
25d60 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
25d70 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
25d80 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
25d90 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
25da0 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
25db0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
25dc0 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
25dd0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
25de0 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
25df0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
25e00 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
25e10 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
25e20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
25e30 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
25e40 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45  n. .** An SQLITE
25e50 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
25e60 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25e70 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a  d if a call to .
25e80 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ** sqlite3OsOpen
25e90 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  () fails..*/.sta
25ea0 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
25eb0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
25ec0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
25ed0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25ee0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25ef0 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
25f00 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
25f10 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
25f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
25f30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
25f40 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
25f50 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
25f60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25f70 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
25f80 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
25f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25fa0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
25fb0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
25fc0 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
25fd0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
25fe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25ff0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26000 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26010 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
26020 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
26030 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
26040 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
26050 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
26060 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
26070 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26080 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
26090 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
260a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
260b0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
260c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
260d0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
260e0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
260f0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
26100 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
26110 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
26120 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
26130 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
26140 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
26150 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26160 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
26170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26180 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
26190 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
261a0 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
261b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
261c0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
261d0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
261e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
261f0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
26200 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
26210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26220 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
26230 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
26240 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
26250 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
26260 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
26270 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
26280 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
26290 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
262a0 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
262b0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
262c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
262d0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
262e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
262f0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
26300 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
26310 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
26320 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
26330 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
26340 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
26350 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
26360 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
26370 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
26380 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
26390 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
263a0 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
263b0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
263c0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
263d0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
263e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
263f0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
26400 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
26410 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
26420 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
26430 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26450 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
26460 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
26470 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
26480 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
26490 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
264a0 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
264b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
264c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
264d0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
264e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
264f0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
26500 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26510 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
26520 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26530 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74  _OFF );.  assert
26540 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
26550 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
26560 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
26570 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
26580 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
26590 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
265a0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
265b0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
265c0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
265d0 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
265e0 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
265f0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
26600 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
26610 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
26620 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
26630 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
26640 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61 6c  TODO: Is it real
26650 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67  ly possible to g
26660 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62 53  et here with dbS
26670 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20  izeValid==0? If 
26680 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61  not,.  ** the ca
26690 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65 63  ll to PagerPagec
266a0 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72 65  ount() can be re
266b0 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65  moved..  */.  te
266c0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
266d0 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
266e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
266f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
26700 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d  , 0);..  pPager-
26710 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
26720 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
26730 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
26740 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
26750 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
26760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26770 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
26780 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
26790 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
267a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
267b0 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21  open. */.  if( !
267c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
267d0 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
267e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
267f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
26800 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
26810 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
26820 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
26830 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
26840 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
26850 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26870 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
26880 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
26890 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
268a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
268b0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
268c0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70  EATE|.        (p
268d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
268e0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ? .          (SQ
268f0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
26900 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
26910 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
26920 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ):.          (SQ
26930 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
26940 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
26950 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
26960 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
26970 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20  RITE.      rc = 
26980 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
26990 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56  en(.          pV
269a0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
269b0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
269c0 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
269d0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
269e0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
269f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26a00 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
26a10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26a20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
26a30 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
26a40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26a60 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
26a70 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a  ->jfd) );.  }...
26a80 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
26a90 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
26aa0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
26ab0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
26ac0 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a   .  ** the sub-j
26ad0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
26ae0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
26af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26b00 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  .    /* TODO: Ch
26b10 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
26b20 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
26b30 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
26b40 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
26b50 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
26b60 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
26b70 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
26b80 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26b90 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
26ba0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
26bb0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26bc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
26bd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74  .    pPager->set
26be0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
26bf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26c00 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  dr = 0;.    rc =
26c10 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
26c20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
26c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26c40 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  K && pPager->nSa
26c50 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72  vepoint ){.    r
26c60 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
26c70 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
26c80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
26c90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
26ca0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
26cb0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
26cc0 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
26cd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
26ce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26cf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
26d00 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
26d10 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
26d20 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
26d30 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
26d40 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
26d50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26d60 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
26d70 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26d80 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
26d90 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
26da0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
26db0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
26dc0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
26dd0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26de0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
26df0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
26e00 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
26e10 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
26e20 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
26e30 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
26e40 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
26e50 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
26e60 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
26e70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
26e80 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
26e90 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
26ea0 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
26eb0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
26ec0 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
26ed0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
26ee0 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
26ef0 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
26f00 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
26f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26f20 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
26f30 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
26f40 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
26f50 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
26f60 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
26f70 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
26f80 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
26f90 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
26fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26fb0 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
26fc0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
26fd0 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
26fe0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
26ff0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
27000 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a  art of it..**.**
27010 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
27020 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
27030 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
27040 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
27050 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
27060 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
27070 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
27080 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
27090 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
270a0 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
270b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
270c0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
270d0 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
270e0 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
270f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
27100 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
27110 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
27120 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
27130 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
27140 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
27150 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
27160 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
27170 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
27180 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
27190 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
271a0 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
271b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
271c0 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
271d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
271e0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
271f0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
27200 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
27210 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
27220 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
27230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27240 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
27250 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
27260 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
27270 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
27280 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
27290 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20  InMemory;.  if( 
272a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
272b0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
272c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
272d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
272e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
272f0 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67 65  !MEMDB && !pPage
27300 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
27310 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
27320 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
27330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27340 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
27350 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
27360 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
27370 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
27380 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
27390 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
273a0 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79 2d  The.    ** busy-
273b0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
273c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
273d0 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
273e0 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
273f0 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
27400 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
27410 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
27420 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
27430 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
27440 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
27450 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
27460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
27480 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27490 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
274a0 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
274b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
274c0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
274d0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
274e0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
274f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
27500 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  If the required 
27510 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63 65  locks were succe
27520 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
27530 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , open the journ
27540 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  al.    ** file a
27550 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69 72  nd write the fir
27560 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
27570 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  r to it..    */.
27580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27590 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
275a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
275b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
275c0 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OFF ){.      rc 
275d0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
275e0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
275f0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
27600 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27610 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
27620 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
27630 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
27640 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
27650 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
27660 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
27670 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  the last.    ** 
27680 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
27690 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
276a0 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
276b0 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
276c0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
276d0 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
276e0 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
276f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
27700 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
27710 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65  t open and eithe
27720 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  r was truncated 
27730 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74  to 0 bytes or it
27740 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20  s header was.   
27750 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20   ** overwritten 
27760 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
27770 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
27780 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
27790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
277a0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
277b0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
277c0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
277d0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
277e0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
277f0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
27800 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
27810 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
27820 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27830 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
27840 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
27850 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
27860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
27870 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
27880 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OK );.  if( rc!=
27890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
278a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
278b0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
278c0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e      /* Ignore an
278d0 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20  y IO error that 
278e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61  occurs within pa
278f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
27900 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a  ion(). The.    *
27910 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  * purpose of thi
27920 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73  s call is to res
27930 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
27940 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
27950 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79  er.    ** sub-sy
27960 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74  stem. It doesn't
27970 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a   matter if the j
27980 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
27990 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20  ot properly.    
279a0 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20  ** finalized at 
279b0 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63  this point (sinc
279c0 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  e it is not a va
279d0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
279e0 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f   anyway)..    */
279f0 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74  .    pager_end_t
27a00 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
27a10 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r, 0);.  }.  ret
27a20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27a30 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
27a40 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
27a50 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
27a60 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
27a70 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
27a80 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
27a90 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
27aa0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
27ab0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
27ac0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
27ad0 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
27ae0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
27af0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
27b00 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
27b10 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
27b20 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
27b30 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
27b40 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
27b50 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
27b60 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
27b70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
27b80 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
27b90 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
27ba0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
27bb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27bc0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
27bd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27be0 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
27bf0 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
27c00 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61  led unless a tra
27c10 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
27c20 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73  eady been.  ** s
27c30 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  tarted..  */.  a
27c40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27c50 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
27c60 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
27c70 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
27c80 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
27c90 74 65 63 74 65 64 2c 20 77 65 20 73 68 6f 75 6c  tected, we shoul
27ca0 64 20 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 63 61  d not be.  ** ca
27cb0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
27cc0 6e 65 2e 20 20 52 65 70 65 61 74 20 74 68 65 20  ne.  Repeat the 
27cd0 65 72 72 6f 72 20 66 6f 72 20 72 6f 62 75 73 74  error for robust
27ce0 6e 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ness..  */.  if(
27cf0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
27d00 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
27d10 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
27d20 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
27d30 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
27d40 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
27d50 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
27d60 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
27d70 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
27d80 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
27d90 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
27da0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
27db0 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
27dc0 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
27dd0 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65  TE_PERM;..  asse
27de0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
27df0 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
27e00 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
27e10 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
27e20 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
27e30 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
27e40 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
27e50 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
27e60 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
27e70 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
27e80 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
27e90 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
27ea0 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
27eb0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
27ec0 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
27ed0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
27ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
27ef0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  ified = 1;.  }el
27f00 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
27f10 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
27f20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
27f30 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
27f40 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
27f50 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
27f60 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
27f70 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
27f80 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
27f90 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
27fa0 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76 65    ** Higher leve
27fb0 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  l routines shoul
27fc0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  d have already s
27fd0 74 61 72 74 65 64 20 61 20 74 72 61 6e 73 61 63  tarted a transac
27fe0 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77 68 69  tion,.    ** whi
27ff0 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20 68 61  ch means they ha
28000 76 65 20 61 63 71 75 69 72 65 64 20 74 68 65 20  ve acquired the 
28010 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
28020 61 6e 64 20 6f 70 65 6e 65 64 0a 20 20 20 20 2a  and opened.    *
28030 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  * a rollback jou
28040 72 6e 61 6c 2e 20 20 44 6f 75 62 6c 65 2d 63 68  rnal.  Double-ch
28050 65 63 6b 20 74 6f 20 6d 61 6b 65 73 20 73 75 72  eck to makes sur
28060 65 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  e this is the ca
28070 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
28080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28090 42 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c  Begin(pPager, 0,
280a0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
280b0 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20  emory);.    if( 
280c0 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
280d0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  _OK) ){.      re
280e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
280f0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
28100 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
28110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
28120 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
28130 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
28140 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28150 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
28160 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
28170 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
28180 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
28190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
281a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
281b0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
281c0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
281d0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
281e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
281f0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
28200 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
28210 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
28220 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
28230 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
28240 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
28250 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
28260 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
28270 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
28280 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
28290 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
282a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
282b0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
282c0 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  g) && isOpen(pPa
282d0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
282e0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
282f0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
28300 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
28310 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
28320 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
28330 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
28340 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
28350 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
28360 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
28370 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
28380 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
28390 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
283a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
283b0 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
283c0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
283d0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
283e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
283f0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
28400 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
28410 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
28420 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
28430 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
28440 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
28450 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
28460 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
28470 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
28480 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
28490 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
284a0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
284b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
284c0 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
284d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
284e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
284f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28500 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28510 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
28520 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28560 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
28570 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28580 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
28590 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20  >pageSize+4;.   
285a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
285b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
285c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
285d0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
285e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
285f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28600 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
28610 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28620 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20  lOff += 4;.     
28630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
28640 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
28650 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
28660 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
28670 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
28680 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28690 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
286a0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
286b0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
286c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
286d0 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
286e0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
286f0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
28700 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
28710 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
28720 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
28730 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
28740 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
28750 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
28760 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
28770 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
28780 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
28790 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
287a0 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
287b0 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
287c0 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e  rred while journ
287d0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
287e0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
287f0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
28800 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
28810 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
28820 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
28830 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
28840 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
28850 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
28860 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
28870 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
28880 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
28890 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
288a0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
288b0 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
288c0 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
288d0 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
288e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
288f0 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
28900 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
28910 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
28920 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
28930 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28940 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
28950 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
28960 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
28970 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
28980 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28990 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
289a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
289b0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
289c0 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e   occurred writin
289d0 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
289e0 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
289f0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
28a00 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
28a10 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
28a20 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
28a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28a40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
28a60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28a70 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  }..        pPage
28a80 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
28a90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28aa0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
28ab0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
28ac0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
28ad0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
28ae0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
28af0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28b00 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
28b10 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
28b20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
28b30 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
28b40 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28b50 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
28b60 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
28b70 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
28b80 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
28b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
28bb0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
28bc0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
28bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
28bf0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
28c00 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
28c10 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
28c20 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
28c30 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
28c40 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
28c50 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
28c60 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
28c70 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
28c80 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
28c90 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
28ca0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
28cb0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
28cc0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
28cd0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
28ce0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
28cf0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
28d00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
28d10 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
28d20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
28d30 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
28d40 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
28d50 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
28d60 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
28d70 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
28d80 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
28d90 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
28da0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
28db0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
28dc0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
28dd0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
28de0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
28df0 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
28e00 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
28e10 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
28e20 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
28e30 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
28e40 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
28e50 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
28e60 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
28e70 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
28e80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28e90 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
28ea0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
28eb0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
28ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
28ed0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
28ee0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
28ef0 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
28f00 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
28f10 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
28f20 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
28f30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
28f40 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
28f50 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
28f60 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
28f70 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
28f80 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
28f90 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
28fa0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
28fb0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
28fc0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
28fd0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
28fe0 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
28ff0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
29000 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
29010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
29020 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
29030 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
29040 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
29050 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
29060 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
29070 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
29080 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
29090 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
290a0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
290b0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
290c0 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
290d0 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
290e0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
290f0 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
29100 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
29110 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
29120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
29130 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
29140 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
29150 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
29160 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
29170 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29180 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
29190 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
291a0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
291b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
291c0 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
291d0 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
291e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
291f0 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
29200 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
29210 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
29220 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
29230 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
29240 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
29250 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
29260 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
29270 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
29280 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
29290 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
292a0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
292b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
292c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
292d0 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292f0 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
29300 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
29310 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
29320 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29340 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
29350 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
29360 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
29370 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
29380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29390 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
293a0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
293b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
293c0 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
293d0 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
293e0 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
293f0 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
29400 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
29410 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
29420 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
29430 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
29440 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
29450 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
29460 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
29470 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
29480 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
29490 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
294a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
294b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
294c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
294d0 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
294e0 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
294f0 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
29500 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
29510 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
29520 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
29530 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
29540 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
29550 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
29560 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
29570 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
29580 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
29590 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
295a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
295b0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
295c0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
295d0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
295e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
295f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
29600 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43  , (int *)&nPageC
29610 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ount);.    if( p
29620 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
29630 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
29640 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
29650 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
29660 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
29670 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
29680 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
29690 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
296a0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
296b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
296c0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
296d0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
296e0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
296f0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
29700 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
29710 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
29720 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
29730 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
29740 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
29750 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
29760 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
29770 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
29780 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
29790 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
297a0 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
297b0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
297c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
297d0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
297e0 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
297f0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
29800 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29810 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
29820 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
29830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29860 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
29870 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29880 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
29890 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
298a0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
298b0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
298c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
298d0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
298e0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
298f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29900 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
29910 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
29920 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29930 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
29940 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
29950 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
29960 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
29970 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
29980 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29990 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
299a0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
299b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
299c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
299d0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
299e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
299f0 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
29a00 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
29a10 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
29a20 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
29a30 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
29a40 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
29a50 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
29a60 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
29a70 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
29a80 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
29a90 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
29aa0 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
29ab0 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
29ac0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
29ad0 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
29ae0 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
29af0 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
29b00 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
29b10 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
29b20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
29b30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29b40 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
29b50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29b60 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
29b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29b80 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
29b90 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
29ba0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
29bb0 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  <nPage; ii++){. 
29bc0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
29bd0 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
29be0 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
29bf0 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
29c00 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
29c10 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
29c20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
29c30 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
29c40 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29c50 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29c60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
29c70 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
29c80 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
29c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29ca0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
29cb0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
29cc0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
29cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
29ce0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
29cf0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
29d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29d10 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
29d20 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
29d30 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
29d40 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
29d50 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
29d60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
29d70 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
29d80 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
29d90 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
29da0 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
29db0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
29dc0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
29dd0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
29de0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
29df0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
29e00 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
29e10 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
29e20 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
29e30 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
29e40 45 54 45 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  ETE./*.** A call
29e50 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
29e60 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
29e70 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
29e80 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
29e90 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
29ea0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
29eb0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
29ec0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
29ed0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
29ee0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
29ef0 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
29f00 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
29f10 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
29f20 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
29f30 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
29f40 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
29f50 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
29f60 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
29f70 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
29f80 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
29f90 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
29fa0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
29fb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
29fc0 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
29fd0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
29fe0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
29ff0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2a000 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
2a010 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
2a020 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
2a030 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
2a040 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
2a050 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
2a060 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
2a070 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
2a080 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
2a090 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
2a0a0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
2a0b0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2a0c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2a0d0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
2a0e0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2a0f0 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
2a100 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
2a110 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2a120 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
2a130 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
2a140 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
2a150 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2a160 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
2a170 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
2a180 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2a190 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
2a1a0 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
2a1b0 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  RITE;.#ifdef SQL
2a1c0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2a1d0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
2a1e0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
2a1f0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
2a200 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2a210 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2a220 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 2a  SECURE_DELETE) *
2a230 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
2a240 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2a250 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
2a260 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
2a270 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
2a280 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
2a290 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
2a2a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2a2b0 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
2a2c0 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
2a2d0 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
2a2e0 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r file..**.** If
2a2f0 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
2a300 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  e flag is zero, 
2a310 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
2a320 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
2a330 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a340 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
2a350 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
2a360 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2a370 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  he.** page data.
2a380 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2a390 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  e file will be u
2a3a0 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  pdated when the 
2a3b0 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2a3c0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
2a3d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ted..**.** The i
2a3e0 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2a3f0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
2a400 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
2a410 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
2a420 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
2a430 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2a440 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
2a450 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
2a460 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
2a470 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
2a480 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2a490 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
2a4a0 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
2a4b0 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
2a4c0 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
2a4d0 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
2a4e0 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
2a4f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
2a500 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2a510 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
2a520 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2a530 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
2a540 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
2a550 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2a560 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2a570 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
2a580 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
2a590 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
2a5a0 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
2a5b0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2a5c0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
2a5d0 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2a5e0 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
2a5f0 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
2a600 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
2a610 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2a620 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
2a630 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
2a640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
2a650 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
2a660 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
2a670 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
2a680 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
2a690 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2a6a0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2a6b0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
2a6c0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2a6d0 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
2a6e0 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
2a6f0 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
2a700 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
2a710 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
2a720 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
2a730 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
2a740 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
2a750 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2a760 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2a770 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64  ATOMIC_WRITE.# d
2a780 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
2a790 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69 73  E 0.  assert( is
2a7a0 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
2a7b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a7c0 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
2a7d0 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  );.#else.# defin
2a7e0 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73  e DIRECT_MODE is
2a7f0 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69  DirectMode.#endi
2a800 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
2a810 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2a820 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
2a830 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
2a840 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20  ngeCountDone && 
2a850 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
2a860 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
2a870 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  PgHdr;          
2a880 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
2a890 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2a8a0 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63      u32 change_c
2a8b0 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
2a8c0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
2a8d0 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75  ue of change-cou
2a8e0 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  nter field */.. 
2a8f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2a900 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2a910 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2a920 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
2a930 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
2a940 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
2a950 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2a960 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2a970 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
2a980 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2a990 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
2a9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
2a9b0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
2a9c0 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
2a9d0 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
2a9e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2a9f0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
2aa00 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
2aa10 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
2aa20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
2aa30 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
2aa40 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
2aa50 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
2aa60 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
2aa70 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
2aa80 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
2aa90 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
2aaa0 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
2aab0 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
2aac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
2aad0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
2aae0 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
2aaf0 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
2ab00 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2ab10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ab20 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
2ab30 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2ab40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ab50 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2ab60 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
2ab70 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
2ab80 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
2ab90 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
2aba0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
2abb0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
2abc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2abd0 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
2abe0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
2abf0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2ac00 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2ac10 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
2ac20 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
2ac30 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
2ac40 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
2ac50 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2ac60 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
2ac70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
2ac80 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
2ac90 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2aca0 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
2acb0 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
2acc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2acd0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
2ace0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2acf0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2ad00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
2ad10 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2ad20 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
2ad30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ad50 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2ad60 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2ad70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2ad80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
2ad90 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2ada0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
2adb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2adc0 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
2add0 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
2ade0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2adf0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2ae00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ae10 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
2ae20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
2ae30 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
2ae40 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
2ae50 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
2ae60 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
2ae70 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
2ae80 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
2ae90 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
2aea0 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
2aeb0 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
2aec0 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
2aed0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2aee0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2aef0 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
2af00 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2af10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2af20 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
2af30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2af40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2af70 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
2af80 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
2af90 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2afa0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2afb0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2afc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2afd0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2afe0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2aff0 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
2b000 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b010 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
2b020 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
2b030 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
2b040 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
2b050 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
2b060 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2b070 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
2b080 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
2b090 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
2b0a0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2b0b0 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
2b0c0 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
2b0d0 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
2b0e0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
2b0f0 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
2b100 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
2b110 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
2b120 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2b130 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  at:.**.**   * Th
2b140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b150 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2b160 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20  s updated,.**   
2b170 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
2b180 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20   synced (unless 
2b190 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2b1a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2b1b0 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61   used),.**   * a
2b1c0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
2b1d0 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
2b1e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b1f0 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74   .**   * the dat
2b200 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72  abase file is tr
2b210 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75  uncated (if requ
2b220 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  ired), and.**   
2b230 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2b240 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a  ile synced. .**.
2b250 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
2b260 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  g that remains t
2b270 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
2b280 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66  nsaction is to f
2b290 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c  inalize .** (del
2b2a0 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72  ete, truncate or
2b2b0 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
2b2c0 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75  part of) the jou
2b2d0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a  rnal file (or .*
2b2e0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * delete the mas
2b2f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2b300 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
2b310 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b320 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
2b330 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
2b340 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
2b350 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
2b360 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
2b370 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2b380 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
2b390 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c  .** If the final
2b3a0 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53   parameter - noS
2b3b0 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74  ync - is true, t
2b3c0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
2b3d0 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20   file itself.** 
2b3e0 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54  is not synced. T
2b3f0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
2b400 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2b410 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20  Sync() directly 
2b420 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64  to.** sync the d
2b430 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
2b440 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d  ore calling Comm
2b450 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20  itPhaseTwo() to 
2b460 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  delete the.** jo
2b470 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
2b480 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
2b490 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2b4a0 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61  itPhaseOne(.  Pa
2b4b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b4d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
2b4e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b4f0 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20  Master,         
2b500 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
2b510 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  L, the master jo
2b520 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
2b530 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20  int noSync      
2b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b550 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2b560 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65  the xSync on the
2b570 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20   db file */.){. 
2b580 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b590 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2b5a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2b5b0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f  */..  /* The dbO
2b5c0 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72  rigSize is never
2b5d0 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f   set if journal_
2b5e0 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73  mode=OFF */.  as
2b5f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2b600 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2b610 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2b620 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72   || pPager->dbOr
2b630 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20  igSize==0 );..  
2b640 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72  /* If a prior er
2b650 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
2b660 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2b670 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 2e  d not be called.
2b680 20 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 2a 2a 20    ROLLBACK.  ** 
2b690 69 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  is the appropria
2b6a0 74 65 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  te response to a
2b6b0 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 43 4f 4d  n error, not COM
2b6c0 4d 49 54 2e 20 20 47 75 61 72 64 20 61 67 61 69  MIT.  Guard agai
2b6d0 6e 73 74 0a 20 20 2a 2a 20 63 6f 64 69 6e 67 20  nst.  ** coding 
2b6e0 65 72 72 6f 72 73 20 62 79 20 72 65 70 65 61 74  errors by repeat
2b6f0 69 6e 67 20 74 68 65 20 70 72 69 6f 72 20 65 72  ing the prior er
2b700 72 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ror. */.  if( NE
2b710 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2b720 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
2b730 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
2b740 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2b750 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
2b760 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
2b770 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
2b780 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
2b790 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
2b7a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
2b7b0 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  );..  if( MEMDB 
2b7c0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2b7d0 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  ified ){.    /* 
2b7e0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
2b7f0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
2b800 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
2b810 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
2b820 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e   this.    ** fun
2b830 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2b840 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
2b850 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f  t is mostly a no
2b860 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61  -op.  However, a
2b870 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70  ny.    ** backup
2b880 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65   in progress nee
2b890 64 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74  ds to be restart
2b8a0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
2b8b0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
2b8c0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
2b8d0 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  kup);.  }else if
2b8e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2b8f0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
2b900 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2b910 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54  ied ){..    /* T
2b920 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2b930 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
2b940 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
2b950 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
2b960 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64    ** does this d
2b970 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
2b980 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
2b990 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2b9a0 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77  ization.    ** w
2b9b0 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
2b9c0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20  mpile time, and 
2b9d0 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  if this transact
2b9e0 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20  ion meets the . 
2b9f0 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72     ** runtime cr
2ba00 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68  iteria to use th
2ba10 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20  e operation: .  
2ba20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a    **.    **    *
2ba30 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
2ba40 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
2ba50 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
2ba60 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20  rty for.    **  
2ba70 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
2ba80 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
2ba90 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  d .    **    * T
2baa0 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
2bab0 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
2bac0 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
2bad0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
2bae0 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
2baf0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
2bb00 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
2bb10 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
2bb20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
2bb30 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
2bb40 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  ization was not 
2bb50 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2bb60 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68  le time, then th
2bb70 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  e.    ** pager_i
2bb80 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bb90 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  r() function is 
2bba0 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65  called to update
2bbb0 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20   the change.    
2bbc0 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69  ** counter in 'i
2bbd0 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49  ndirect-mode'. I
2bbe0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2bbf0 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  on is compiled i
2bc00 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20 69 73 20  n but.    ** is 
2bc10 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
2bc20 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
2bc30 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
2bc40 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
2bc50 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73      ** to make s
2bc60 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
2bc70 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c  file has actuall
2bc80 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
2bc90 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  then call.    **
2bca0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bcb0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2bcc0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2bcd0 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
2bce0 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rect.    ** mode
2bcf0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
2bd00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
2bd10 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2bd20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20  is both enabled 
2bd30 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a  and applicable,.
2bd40 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c      ** then call
2bd50 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bd60 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2bd70 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2bd80 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20  -counter.    ** 
2bd90 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65  in 'direct' mode
2bda0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2bdb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bdc0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20  will never be.  
2bdd0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
2bde0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2bdf0 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  n..    */.#ifdef
2be00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2be10 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2be20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
2be30 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2be40 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2be50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2be60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2be70 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20  LMODE_OFF );.   
2be80 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26   if( !zMaster &&
2be90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2bea0 6a 66 64 29 20 0a 20 20 20 20 20 26 26 20 70 50  jfd) .     && pP
2beb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2bec0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
2bed0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 26  (pPager) .     &
2bee0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
2bef0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  >=pPager->dbFile
2bf00 53 69 7a 65 0a 20 20 20 20 20 26 26 20 28 30 3d  Size.     && (0=
2bf10 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
2bf20 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2bf30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
2bf40 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
2bf50 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ty).    ){.     
2bf60 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
2bf70 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
2bf80 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
2bf90 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
2bfa0 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 2a 2a  d. The .      **
2bfb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
2bfc0 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20  will modify the 
2bfd0 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
2bfe0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
2bff0 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20   1 .      ** to 
2c000 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
2c010 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ted change count
2c020 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
2c030 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  e page 1 .      
2c040 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  ** directly to t
2c050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c060 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
2c070 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20   atomic-write . 
2c080 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
2c090 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
2c0a0 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
2c0b0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
2c0c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c0d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c0e0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
2c0f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2c110 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2c120 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2c130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2c150 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2c160 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2c170 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
2c180 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72     }.#else.    r
2c190 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c1a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c1b0 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ger, 0);.#endif.
2c1c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c1d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2c1e0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2c1f0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  it;..    /* If t
2c200 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
2c210 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
2c220 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
2c230 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
2c240 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
2c250 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
2c260 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
2c270 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2c280 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
2c290 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2c2a0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
2c2b0 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
2c2c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72   **.    ** Befor
2c2d0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
2c2e0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
2c2f0 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
2c300 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75  n the .    ** cu
2c310 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
2c320 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74  ager.dbSize, set
2c330 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20   dbSize back to 
2c340 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
2c350 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
2c360 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2c370 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
2c380 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
2c390 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
2c3a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2c3b0 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61  return zeroed pa
2c3c0 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  ges instead of .
2c3d0 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64      ** reading d
2c3e0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
2c3f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2c400 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 6a  **.    ** When j
2c410 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46  ournal_mode==OFF
2c420 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   the dbOrigSize 
2c430 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c 20  is always zero, 
2c440 73 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 62  so this.    ** b
2c450 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20  lock never runs 
2c460 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
2c470 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  OFF..    */.#ifn
2c480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c490 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2c4a0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2c4b0 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
2c4c0 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20 41 4c  Size .     && AL
2c4d0 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75  WAYS(pPager->jou
2c4e0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2c4f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
2c500 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 50 67  .    ){.      Pg
2c510 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  no i;           
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c530 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2c540 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2c550 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
2c560 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
2c570 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20  J_PGNO(pPager); 
2c580 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  /* Pending lock 
2c590 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  page */.      co
2c5a0 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20  nst Pgno dbSize 
2c5b0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
2c5c0 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
2c5d0 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a  ase image size *
2c5e0 2f 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  / .      pPager-
2c5f0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
2c600 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
2c610 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a      for( i=dbSiz
2c620 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  e+1; i<=pPager->
2c630 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20  dbOrigSize; i++ 
2c640 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
2c650 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
2c660 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
2c670 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
2c680 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
2c690 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20    PgHdr *pPage; 
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2c6b0 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  age to journal *
2c6c0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
2c6d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2c6e0 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61  (pPager, i, &pPa
2c6f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2c700 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c710 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2c720 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2c730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2c740 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c750 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c760 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2c770 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2c780 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c790 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c7a0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c7b0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
2c7c0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 70        } .      p
2c7d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
2c7e0 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 23 65  dbSize;.    }.#e
2c7f0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
2c800 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
2c810 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
2c820 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c830 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20  . If a master . 
2c840 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
2c850 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
2c860 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
2c870 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2c880 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20 6f 72  file, .    ** or
2c890 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e   if zMaster is N
2c8a0 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a  ULL (no master j
2c8b0 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68  ournal), then th
2c8c0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
2c8d0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
2c8e0 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
2c8f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
2c900 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28  Master);.    if(
2c910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c920 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2c930 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20  se_one_exit;..  
2c940 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2c950 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
2c960 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
2c970 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2c980 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73   being.    ** us
2c990 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69  ed, this call wi
2c9a0 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68  ll not create th
2c9b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2c9c0 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20  r perform any.  
2c9d0 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20    ** real IO..  
2c9e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 79    */.    rc = sy
2c9f0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2ca00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ca10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2ca20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2ca30 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57  _exit;..    /* W
2ca40 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
2ca50 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
2ca60 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2ca70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2ca80 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c 69  te_pagelist(sqli
2ca90 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2caa0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2cab0 68 65 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  he));.    if( rc
2cac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2cad0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
2cae0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
2caf0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 67  OCKED );.      g
2cb00 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2cb10 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d  _one_exit;.    }
2cb20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2cb30 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
2cb40 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
2cb50 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2cb60 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20   on disk is not 
2cb70 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
2cb80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2cb90 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  age,.    ** then
2cba0 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63   use pager_trunc
2cbb0 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73  ate to grow or s
2cbc0 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68  hrink the file h
2cbd0 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
2cbe0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2cbf0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
2cc00 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
2cc10 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67  Pgno nNew = pPag
2cc20 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50  er->dbSize - (pP
2cc30 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41  ager->dbSize==PA
2cc40 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2cc50 65 72 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er));.      asse
2cc60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2cc70 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
2cc80 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  VE );.      rc =
2cc90 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
2cca0 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20  pPager, nNew);. 
2ccb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ccc0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2ccd0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2cce0 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xit;.    }..    
2ccf0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63  /* Finally, sync
2cd00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cd10 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
2cd20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
2cd30 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
2cd40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2cd50 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
2cd60 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
2cd70 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
2cd80 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
2cd90 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
2cda0 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
2cdb0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
2cdc0 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74  CED;.  }..commit
2cdd0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a  _phase_one_exit:
2cde0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2cdf0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
2ce00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ce10 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
2ce20 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
2ce30 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
2ce40 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
2ce50 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
2ce60 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
2ce70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
2ce80 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
2ce90 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
2cea0 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
2ceb0 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
2cec0 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
2ced0 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
2cee0 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
2cef0 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
2cf00 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
2cf10 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
2cf20 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
2cf30 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2cf40 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
2cf50 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2cf60 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
2cf70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2cf80 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
2cf90 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
2cfa0 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
2cfb0 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
2cfc0 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
2cfd0 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
2cfe0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2cff0 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
2d000 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
2d010 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
2d020 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
2d030 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2d040 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2d050 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2d060 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2d070 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
2d080 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2d090 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
2d0a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2d0b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2d0c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2d0d0 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
2d0e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2d0f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d110 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d120 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2d130 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
2d140 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61  t be called if a
2d150 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73   prior error has
2d160 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
2d170 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20 61  But if (due to a
2d180 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c   coding error el
2d190 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 73  sewhere in the s
2d1a0 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67  ystem) it does g
2d1b0 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  et.  ** called, 
2d1c0 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
2d1d0 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  same error code 
2d1e0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2d1f0 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  ything. */.  if(
2d200 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2d210 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2d220 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d230 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
2d240 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
2d250 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
2d260 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
2d270 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  n at least.  ** 
2d280 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
2d290 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64  tate. And indeed
2d2a0 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f   SQLite never do
2d2b0 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20  es this. But it 
2d2c0 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20  is.  ** nice to 
2d2d0 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73  have this defens
2d2e0 69 76 65 20 74 65 73 74 20 68 65 72 65 20 61 6e  ive test here an
2d2f0 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  yway..  */.  if(
2d300 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73   NEVER(pPager->s
2d310 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
2d320 56 45 44 29 20 29 20 72 65 74 75 72 6e 20 53 51  VED) ) return SQ
2d330 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  LITE_ERROR;..  /
2d340 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
2d350 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
2d360 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
2d370 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
2d380 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
2d390 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
2d3a0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2d3b0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2d3c0 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
2d3d0 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
2d3e0 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
2d3f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2d400 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
2d410 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
2d420 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d430 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2d440 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
2d450 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
2d460 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
2d470 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
2d480 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
2d490 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
2d4a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
2d4b0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
2d4c0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
2d4d0 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
2d4e0 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
2d4f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
2d500 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2d510 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
2d520 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2d530 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
2d540 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
2d550 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
2d560 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
2d570 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
2d580 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
2d590 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
2d5a0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
2d5b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2d5c0 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
2d5d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2d5e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2d5f0 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
2d600 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
2d620 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2d630 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74  ager) );.    ret
2d640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d650 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2d660 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
2d670 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2d680 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2d690 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2d6a0 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
2d6b0 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
2d6c0 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72  bModified );.  r
2d6d0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
2d6e0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2d6f0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2d700 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ter);.  return p
2d710 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2d720 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
2d730 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
2d740 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62  anges. The datab
2d750 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
2d760 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
2d770 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
2d780 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
2d790 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a  s two tasks:.**.
2d7a0 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73  **   1) It rolls
2d7b0 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61   back the journa
2d7c0 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e  l file, restorin
2d7d0 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  g all database f
2d7e0 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ile and .**     
2d7f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2d800 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74   pages to the st
2d810 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e  ate they were in
2d820 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
2d830 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61  ction.**      wa
2d840 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a  s opened, and.**
2d850 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a     2) It finaliz
2d860 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
2d870 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20  ile, so that it 
2d880 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  is not used for 
2d890 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  hot.**      roll
2d8a0 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e  back at any poin
2d8b0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
2d8c0 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74  .**.** subject t
2d8d0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2d8e0 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a  qualifications:.
2d8f0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a  **.** * If the j
2d900 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2d910 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e  ot yet open when
2d920 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d930 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74  s called,.**   t
2d940 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20  hen only (2) is 
2d950 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68  performed. In th
2d960 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2d970 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   no journal file
2d980 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61  .**   to roll ba
2d990 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69  ck..**.** * If i
2d9a0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2d9b0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2d9c0 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61  TE_FULL, then ta
2d9d0 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20  sk (1) is .**   
2d9e0 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75  performed. If su
2d9f0 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28  ccessful, task (
2da00 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  2). Regardless o
2da10 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a  f the outcome.**
2da20 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68     of either, th
2da30 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
2da40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2da50 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
2da60 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69  er.**   (i.e. ei
2da70 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
2da80 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52  R or SQLITE_CORR
2da90 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  UPT)..**.** * If
2daa0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2dab0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2dac0 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2dad0 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72  mpt (1). Whether
2dae0 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29  .**   or not (1)
2daf0 20 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20   is succussful, 
2db00 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29  also attempt (2)
2db10 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2db20 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c   return.**   SQL
2db30 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2db40 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  e, enter the err
2db50 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2db60 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a  urn the first .*
2db70 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65  *   error code e
2db80 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a  ncountered. .**.
2db90 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2dba0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  e there is no ch
2dbb0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61  ance that the da
2dbc0 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74  tabase was writt
2dbd0 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20  en to. .**   So 
2dbe0 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  is safe to final
2dbf0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
2dc00 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  file even if the
2dc10 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20   playback .**   
2dc20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61  (operation 1) fa
2dc30 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68  iled. However th
2dc40 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74  e pager must ent
2dc50 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2dc60 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63  te.**   as the c
2dc70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
2dc80 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61  n-memory cache a
2dc90 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a  re now suspect..
2dca0 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c  **.** * Finally,
2dcb0 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43   if in PAGER_EXC
2dcc0 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
2dcd0 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
2dce0 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70  Only.**   attemp
2dcf0 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20  t (2) if (1) is 
2dd00 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75  successful. Retu
2dd10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2dd20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20  successful,.**  
2dd30 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72   otherwise enter
2dd40 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2dd50 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2dd60 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
2dd70 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e  the .**   failin
2dd80 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  g operation..**.
2dd90 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2dda0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
2ddb0 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ile may have bee
2ddc0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f  n written to. So
2ddd0 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61   if the.**   pla
2dde0 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2ddf0 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20  did not succeed 
2de00 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
2de10 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
2de20 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
2de30 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73  l file. It needs
2de40 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74   to be left in t
2de50 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2de60 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65  o that.**   some
2de70 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
2de80 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73  an use it to res
2de90 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
2dea0 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20  e state (by.**  
2deb0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2dec0 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lback)..*/.int s
2ded0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
2dee0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
2def0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2df00 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2df10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2df20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
2df30 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
2df40 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
2df50 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2df60 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62   if( !pPager->db
2df70 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f  Modified || !isO
2df80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2df90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2dfa0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2dfb0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2dfc0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2dfd0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2dfe0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
2dff0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
2e000 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
2e010 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2e020 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2e030 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
2e040 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2e050 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
2e060 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
2e070 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
2e080 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2e090 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
2e0a0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20  ESERVED ){.     
2e0b0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
2e0c0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2e0d0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2e0e0 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
2e0f0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2e100 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2e110 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2e120 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e140 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
2e150 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2e160 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2e170 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e180 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
2e190 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2e1a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2e1b0 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  eValid = 0;.    
2e1c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  }..    /* If an 
2e1d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
2e1e0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
2e1f0 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
2e200 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
2e210 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  .    ** cache. S
2e220 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
2e230 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
2e240 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
2e250 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65  error .    ** pe
2e260 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f  rsistent..    */
2e270 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2e280 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2e290 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2e2a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2e2b0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2e2c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2e2d0 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
2e2e0 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
2e2f0 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
2e300 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
2e310 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
2e320 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  u8 sqlite3PagerI
2e330 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
2e340 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e350 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
2e360 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
2e370 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2e380 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2e390 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
2e3a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
2e3b0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
2e3c0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e3d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2e3e0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2e3f0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
2e400 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2e410 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2e420 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  s to the specifi
2e430 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  ed page..*/.int 
2e440 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2e450 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20  Refcount(DbPage 
2e460 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
2e470 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  n sqlite3PcacheP
2e480 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
2e490 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  e);.}..#ifdef SQ
2e4a0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
2e4b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2e4c0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
2e4d0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
2e4e0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
2e4f0 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
2e500 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2e510 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
2e520 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74  ;.  a[0] = sqlit
2e530 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2e540 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2e550 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69  );.  a[1] = sqli
2e560 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
2e570 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2e580 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71  he);.  a[2] = sq
2e590 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61  lite3PcacheGetCa
2e5a0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
2e5b0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d  pPCache);.  a[3]
2e5c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2e5d0 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70  eValid ? (int) p
2e5e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
2e5f0 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  -1;.  a[4] = pPa
2e600 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
2e610 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
2e620 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
2e630 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
2e640 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
2e650 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
2e660 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
2e670 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
2e680 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
2e690 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
2e6a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
2e6b0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
2e6c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2e6d0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2e6e0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2e6f0 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  ry pager..*/.int
2e700 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
2e710 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
2e720 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
2e730 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  MDB;.}../*.** Ch
2e740 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 61  eck that there a
2e750 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76  re at least nSav
2e760 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74  epoint savepoint
2e770 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65  s open. If there
2e780 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
2e790 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76  y less than nSav
2e7a0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68  epoints open, th
2e7b0 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d  en open one or m
2e7c0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a  ore savepoints.*
2e7d0 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65  * to make up the
2e7e0 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20   difference. If 
2e7f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
2e800 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65  vepoints is alre
2e810 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20  ady.** equal to 
2e820 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e  nSavepoint, then
2e830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2e840 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2e850 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
2e860 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53  ocation fails, S
2e870 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
2e880 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
2e890 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2e8a0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68  while opening th
2e8b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
2e8c0 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65  le, then an IO e
2e8d0 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20  rror code is.** 
2e8e0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
2e8f0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
2e900 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e910 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
2e920 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2e930 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b  int nSavepoint){
2e940 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e950 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e970 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e980 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20   int nCurrent = 
2e990 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2e9a0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  nt;        /* Cu
2e9b0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
2e9c0 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20  savepoints */.. 
2e9d0 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e   if( nSavepoint>
2e9e0 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 61 67  nCurrent && pPag
2e9f0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2ea00 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  {.    int ii;   
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea30 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2ea40 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53  le */.    PagerS
2ea50 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20  avepoint *aNew; 
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea70 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61    /* New Pager.a
2ea80 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
2ea90 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65  */..    /* Eithe
2eaa0 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63  r there is no ac
2eab0 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tive journal or 
2eac0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2ead0 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20 20 20  is open or .    
2eae0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
2eaf0 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
2eb00 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20  in memory */.   
2eb10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2eb20 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >nSavepoint==0 |
2eb30 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
2eb40 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20 20 20 20  >sjfd) ||.      
2eb50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2eb60 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2eb70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2eb80 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ORY );..    /* G
2eb90 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61 53  row the Pager.aS
2eba0 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75  avepoint array u
2ebb0 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20  sing realloc(). 
2ebc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
2ebd0 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  MEM.    ** if th
2ebe0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  e allocation fai
2ebf0 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ls. Otherwise, z
2ec00 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74  ero the new port
2ec10 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20  ion in case a . 
2ec20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69     ** malloc fai
2ec30 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
2ec40 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20  e populating it 
2ec50 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20  in the for(...) 
2ec60 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20  loop below..    
2ec70 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50  */.    aNew = (P
2ec80 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29  agerSavepoint *)
2ec90 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
2eca0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ecb0 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65  aSavepoint, size
2ecc0 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
2ecd0 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20  t)*nSavepoint.  
2ece0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e    );.    if( !aN
2ecf0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ew ){.      retu
2ed00 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2ed10 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2ed20 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74  t(&aNew[nCurrent
2ed30 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e  ], 0, (nSavepoin
2ed40 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69  t-nCurrent) * si
2ed50 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
2ed60 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65  int));.    pPage
2ed70 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
2ed80 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67 65 72  aNew;.    pPager
2ed90 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
2eda0 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20  Savepoint;..    
2edb0 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
2edc0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73  PagerSavepoint s
2edd0 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20 61  tructures just a
2ede0 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20  llocated. */.   
2edf0 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74   for(ii=nCurrent
2ee00 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b  ; ii<nSavepoint;
2ee10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2ee20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2ee30 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
2ee40 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69     aNew[ii].nOri
2ee50 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  g = pPager->dbSi
2ee60 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ze;.      if( is
2ee70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ee80 29 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67  ) && ALWAYS(pPag
2ee90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
2eea0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65  ) ){.        aNe
2eeb0 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20  w[ii].iOffset = 
2eec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2eed0 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ff;.      }else{
2eee0 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69  .        aNew[ii
2eef0 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52  ].iOffset = JOUR
2ef00 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
2ef10 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2ef20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52    aNew[ii].iSubR
2ef30 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  ec = pPager->nSu
2ef40 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77  bRec;.      aNew
2ef50 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2ef60 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
2ef70 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
2ef80 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  dbSize);.      i
2ef90 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e  f( !aNew[ii].pIn
2efa0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2efb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2efc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2efd0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2efe0 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2eff0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e  rnal, if it is n
2f000 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  ot already opene
2f010 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  d. */.    rc = o
2f020 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2f030 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
2f040 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
2f050 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  int(pPager);.  }
2f060 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2f070 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2f080 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2f090 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
2f0a0 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
2f0b0 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20  a savepoint..** 
2f0c0 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2f0d0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
2f0e0 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65  back need not be
2f0f0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2f100 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73  ly .** created s
2f110 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
2f120 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20  Parameter op is 
2f130 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41  always either SA
2f140 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2f150 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
2f160 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20  LEASE..** If it 
2f170 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
2f180 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61  EASE, then relea
2f190 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74  se and destroy t
2f1a0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74  he savepoint wit
2f1b0 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65  h.** index iSave
2f1c0 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20  point. If it is 
2f1d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2f1e0 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63  CK, then rollbac
2f1f0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a  k all changes.**
2f200 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
2f210 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70  red since the sp
2f220 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2f230 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
2f240 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  *.** The savepoi
2f250 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  nt to rollback o
2f260 72 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65  r release is ide
2f270 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
2f280 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f  eter .** iSavepo
2f290 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  int. A value of 
2f2a0 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61  0 means to opera
2f2b0 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d  te on the outerm
2f2c0 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ost savepoint.**
2f2d0 20 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61   (the first crea
2f2e0 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66  ted). A value of
2f2f0 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
2f300 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72  nt-1) means oper
2f310 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  ate.** on the mo
2f320 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
2f330 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  ted savepoint. I
2f340 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f iSavepoint is 
2f350 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
2f360 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
2f370 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20  t-1), then this 
2f380 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2f390 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
2f3a0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69  negative value i
2f3b0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
2f3c0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
2f3d0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
2f3e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
2f3f0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
2f400 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20  is different to 
2f410 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
2f420 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
2f430 28 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20  () because this 
2f440 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2f450 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74  t terminate.** t
2f460 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
2f470 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  r unlock the dat
2f480 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72  abase, it just r
2f490 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20  estores the .** 
2f4a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2f4b0 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
2f4c0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
2f4d0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61  .**.** In any ca
2f4e0 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  se, all savepoin
2f4f0 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ts with an index
2f500 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53   greater than iS
2f510 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65  avepoint .** are
2f520 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74   destroyed. If t
2f530 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
2f540 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d   operation (op==
2f550 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2f560 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65  E),.** then save
2f570 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
2f580 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79   is also destroy
2f590 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
2f5a0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2f5b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
2f5c0 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
2f5d0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
2f5e0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
2f5f0 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72  code if an IO er
2f600 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2f610 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
2f620 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  .** savepoint. I
2f630 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75  f no errors occu
2f640 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
2f650 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e  returned..*/ .in
2f660 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  t sqlite3PagerSa
2f670 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
2f680 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69  Pager, int op, i
2f690 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
2f6a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f6b0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2f6c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2f6d0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
2f6e0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2f6f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
2f700 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f  avepoint>=0 || o
2f710 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2f720 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  LBACK );..  if( 
2f730 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65  iSavepoint<pPage
2f740 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
2f750 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
2f760 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2f770 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2f780 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20      int nNew;   
2f790 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f7a0 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61   of remaining sa
2f7b0 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74  vepoints after t
2f7c0 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20  his op. */..    
2f7d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2f7e0 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  w many savepoint
2f7f0 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20  s will still be 
2f800 61 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69  active after thi
2f810 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  s.    ** operati
2f820 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76  on. Store this v
2f830 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68  alue in nNew. Th
2f840 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65  en free resource
2f850 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20  s associated .  
2f860 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61    ** with any sa
2f870 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72  vepoints that ar
2f880 65 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74  e destroyed by t
2f890 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
2f8a0 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d     */.    nNew =
2f8b0 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 28   iSavepoint + ((
2f8c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2f8d0 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a 20 31  ELEASE ) ? 0 : 1
2f8e0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
2f8f0 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
2f900 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2f910 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
2f920 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
2f930 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2f940 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2f950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2f960 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2f970 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
2f980 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
2f990 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
2f9a0 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
2f9b0 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
2f9c0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
2f9d0 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  l to zero bytes 
2f9e0 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20  in size. */.    
2f9f0 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
2fa00 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
2fa10 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
2fa20 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2fa30 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
2fa40 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 61    /* Only trunca
2fa50 74 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 69  te if it is an i
2fa60 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
2fa70 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rnal. */.       
2fa80 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
2fa90 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
2faa0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
2fab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fac0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
2fad0 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20  r->sjfd, 0);.   
2fae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2faf0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
2fb00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2fb10 7d 0a 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68  }.    /* Else th
2fb20 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
2fb30 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79   operation, play
2fb40 62 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69  back the specifi
2fb50 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20  ed savepoint..  
2fb60 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2fb70 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20  a temp-file, it 
2fb80 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
2fb90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fba0 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  e has.    ** not
2fbb0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2fbc0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2fbd0 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
2fbe0 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20  o changes to.   
2fbf0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2fc00 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c   file, so the pl
2fc10 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  ayback operation
2fc20 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
2fc30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65  .    */.    else
2fc40 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2fc50 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2fc60 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
2fc70 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
2fc80 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67  nNew==0)?0:&pPag
2fc90 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e  er->aSavepoint[n
2fca0 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63  New-1];.      rc
2fcb0 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b   = pagerPlayback
2fcc0 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
2fcd0 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
2fce0 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d       assert(rc!=
2fcf0 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20  SQLITE_DONE);.  
2fd00 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74    }.  .  }.  ret
2fd10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fd20 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2fd30 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2fd40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2fd50 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2fd60 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2fd70 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
2fd80 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2fd90 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
2fda0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2fdb0 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
2fdc0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
2fdd0 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
2fde0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
2fdf0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
2fe00 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2fe10 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
2fe20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2fe30 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
2fe40 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2fe50 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
2fe60 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
2fe70 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
2fe80 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
2fe90 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
2fea0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2feb0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
2fec0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
2fed0 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
2fee0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2fef0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
2ff00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2ff10 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2ff20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2ff30 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2ff40 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2ff50 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
2ff60 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2ff70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ff80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2ff90 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
2ffa0 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
2ffb0 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
2ffc0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
2ffd0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
2ffe0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
2fff0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
30000 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
30010 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
30020 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
30030 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
30040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
30050 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
30060 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
30070 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
30080 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
30090 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
300a0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
300b0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
300c0 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
300d0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
300e0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
300f0 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
30100 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20  id*,int,int),.  
30110 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
30120 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  e)(void*),.  voi
30130 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69  d *pCodec.){.  i
30140 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
30150 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
30160 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
30170 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50  r->pCodec);.  pP
30180 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70  ager->xCodec = p
30190 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30  Pager->memDb ? 0
301a0 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   : xCodec;.  pPa
301b0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
301c0 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65  hng = xCodecSize
301d0 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Chng;.  pPager->
301e0 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f  xCodecFree = xCo
301f0 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65  decFree;.  pPage
30200 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64  r->pCodec = pCod
30210 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72  ec;.  pagerRepor
30220 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  tSize(pPager);.}
30230 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71  .static void *sq
30240 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64  lite3PagerGetCod
30250 65 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ec(Pager *pPager
30260 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
30270 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65  er->pCodec;.}.#e
30280 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
30290 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
302a0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
302b0 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
302c0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
302d0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
302e0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
302f0 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
30300 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
30310 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
30320 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
30330 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
30340 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
30350 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
30360 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
30370 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
30380 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
30390 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
303a0 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
303b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
303c0 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
303d0 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
303e0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
303f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
30400 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
30410 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
30420 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
30430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
30440 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
30450 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
30460 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
30470 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
30480 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
30490 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
304a0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
304b0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
304c0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
304d0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
304e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
304f0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
30500 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
30510 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
30520 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
30530 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
30540 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
30550 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
30560 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
30570 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
30580 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
30590 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
305a0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
305b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
305c0 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
305d0 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
305e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
305f0 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
30600 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
30610 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
30620 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
30630 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
30640 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
30650 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
30660 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
30670 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
30680 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
30690 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
306a0 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
306b0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
306c0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
306d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
306e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
306f0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
30700 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
30710 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
30720 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
30730 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  urs. Otherwise, 
30740 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
30750 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
30760 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
30770 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
30780 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
30790 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43  no pgno, int isC
307a0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20  ommit){.  PgHdr 
307b0 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20  *pPgOld;        
307c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
307d0 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
307e0 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20  tten. */.  Pgno 
307f0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
30800 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76  ;       /* Old v
30810 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e  alue of pPg->pgn
30820 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65  o, if sync is re
30830 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
30840 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30850 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30860 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
30870 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20  o origPgno;     
30880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30890 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e   original page n
308a0 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  umber */..  asse
308b0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
308c0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65  );..  /* In orde
308d0 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  r to be able to 
308e0 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d  rollback, an in-
308f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
30900 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  must journal.  *
30910 2a 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  * the page we ar
30920 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20  e moving from.. 
30930 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
30940 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
30950 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30960 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
30970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30980 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
30990 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73  e being moved is
309a0 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e   dirty and has n
309b0 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79  ot been saved by
309c0 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a   the latest.  **
309d0 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
309e0 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
309f0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
30a00 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
30a10 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
30a20 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72  l now. This is r
30a30 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c  equired to handl
30a40 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
30a50 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20  scenario:.  **. 
30a60 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a   **   BEGIN;.  *
30a70 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
30a80 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69  age X, then modi
30a90 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e  fy it in memory>
30aa0 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f  .  **     SAVEPO
30ab0 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20  INT one;.  **   
30ac0 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58      <Move page X
30ad0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a   to location Y>.
30ae0 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
30af0 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  K TO one;.  **. 
30b00 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65   ** If page X we
30b10 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  re not written t
30b20 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
30b30 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64  l here, it would
30b40 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73   not.  ** be pos
30b50 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65  sible to restore
30b60 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68   its contents wh
30b70 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
30b80 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74   TO one".  ** st
30b90 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20  atement were is 
30ba0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a  processed..  **.
30bb0 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50    ** subjournalP
30bc0 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74  age() may need t
30bd0 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
30be0 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70   to store pPg->p
30bf0 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e  gno into.  ** on
30c00 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
30c10 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69  int bitvecs. Thi
30c20 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20  s is the reason 
30c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
30c40 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
30c50 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f  LITE_NOMEM..  */
30c60 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
30c70 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20  s&PGHDR_DIRTY.  
30c80 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
30c90 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
30ca0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
30cb0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
30cc0 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
30cd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
30ce0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
30cf0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
30d00 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
30d10 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
30d20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
30d30 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
30d40 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
30d50 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
30d60 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
30d70 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
30d80 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
30d90 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
30da0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
30db0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
30dc0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
30dd0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
30de0 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
30df0 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
30e00 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
30e10 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
30e20 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
30e30 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
30e40 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
30e50 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
30e60 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
30e70 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
30e80 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
30e90 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
30ea0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
30eb0 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
30ec0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
30ed0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
30ee0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
30ef0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
30f00 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
30f10 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
30f20 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
30f30 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
30f40 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
30f50 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
30f60 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
30f70 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
30f80 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
30f90 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
30fa0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
30fb0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
30fc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30fd0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
30fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
30ff0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
31000 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
31010 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
31020 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
31030 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
31040 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
31050 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
31060 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
31070 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
31080 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
31090 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
310a0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
310b0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
310c0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
310d0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
310e0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
310f0 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
31100 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
31110 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
31120 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
31130 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
31140 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
31150 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
31160 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
31170 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
31180 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66  ED_SYNC);.    if
31190 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
311a0 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61   /* Do not disca
311b0 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e  rd pages from an
311c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
311d0 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67  ase since we mig
311e0 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64  ht.      ** need
311f0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74   to rollback lat
31200 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74  er.  Just move t
31210 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74  he page out of t
31220 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20  he way. */.     
31230 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31240 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
31250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
31260 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20  cheMove(pPgOld, 
31270 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31  pPager->dbSize+1
31280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31290 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
312a0 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20  eDrop(pPgOld);. 
312b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67     }.  }..  orig
312c0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
312d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
312e0 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
312f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
31300 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
31310 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
31320 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
31330 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
31340 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
31350 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
31360 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
31370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
31380 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
31390 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
313a0 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
313b0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
313c0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
313d0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
313e0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
313f0 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
31400 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
31410 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
31420 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
31430 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
31440 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
31450 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
31460 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
31470 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
31480 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
31490 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
314a0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
314b0 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
314c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
314d0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
314e0 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
314f0 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
31500 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
31510 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
31520 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
31530 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
31540 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
31550 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
31560 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
31570 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
31580 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
31590 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
315a0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
315b0 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
315c0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
315d0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
315e0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
315f0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
31600 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
31610 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
31620 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
31630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
31640 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
31650 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
31660 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
31670 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
31680 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
31690 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
316a0 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
316b0 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
316c0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
316d0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
316e0 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
316f0 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
31700 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
31710 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
31720 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
31730 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
31740 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
31750 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31770 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
31780 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
31790 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
317a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
317b0 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29  ->pTmpSpace!=0 )
317c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
317d0 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
317e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
317f0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70   needSyncPgno, p
31800 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
31810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31820 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31830 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
31840 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
31850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31860 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
31870 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
31880 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
31890 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
318a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
318b0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
318c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
318d0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
318e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
318f0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
31900 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73  database, make s
31910 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ure the original
31920 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a   page continues.
31930 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69    ** to exist, i
31940 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
31950 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
31960 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20  roll back.  Use 
31970 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74  pPgOld.  ** as t
31980 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
31990 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c   since it has al
319a0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
319b0 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ated..  */.  if(
319c0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71   MEMDB ){.    sq
319d0 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
319e0 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f  pPgOld, origPgno
319f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
31a00 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29  gerUnref(pPgOld)
31a10 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
31a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
31a30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
31a40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
31a50 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
31a60 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
31a70 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
31a80 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
31a90 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  age *pPg){.  ass
31aa0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
31ab0 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
31ac0 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75  >memDb );.  retu
31ad0 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d  rn pPg->pData;.}
31ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
31af0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31b00 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
31b10 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
31b20 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
31b30 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
31b40 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
31b50 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
31b60 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
31b70 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
31b80 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72  eturn pPg->pExtr
31b90 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  a;.}../*.** Get/
31ba0 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
31bb0 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
31bc0 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
31bd0 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
31be0 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
31bf0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
31c00 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31c10 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
31c20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31c30 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
31c40 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
31c50 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
31c60 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
31c70 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
31c80 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
31c90 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
31ca0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
31cb0 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
31cc0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
31cd0 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
31ce0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
31cf0 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
31d00 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
31d10 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
31d20 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
31d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31d40 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
31d50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
31d60 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
31d70 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
31d80 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
31d90 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
31da0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
31db0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
31dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
31dd0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
31de0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
31df0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
31e00 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31e10 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
31e20 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
31e30 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
31e40 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
31e50 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
31e60 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
31e70 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
31e80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
31e90 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
31ea0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65  siveMode = (u8)e
31eb0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
31ec0 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
31ed0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
31ee0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
31ef0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
31f00 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
31f10 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
31f20 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
31f30 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  .**.**    PAGER_
31f40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
31f50 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
31f60 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
31f70 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31f80 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
31f90 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
31fa0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
31fb0 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  T.**    PAGER_JO
31fc0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a  URNALMODE_OFF.**
31fd0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
31fe0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a  LMODE_MEMORY.**.
31ff0 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  ** If the parame
32000 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
32010 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  Y, then the jour
32020 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74 20  nal_mode is set 
32030 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  to the.** value 
32040 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65  specified if the
32050 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77   change is allow
32060 65 64 2e 20 20 54 68 65 20 63 68 61 6e 67 65 20  ed.  The change 
32070 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a  is disallowed.**
32080 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
32090 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a  ng reasons:.**.*
320a0 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d  *   *  An in-mem
320b0 6f 72 79 20 64 61 74 61 62 61 73 65 20 63 61 6e  ory database can
320c0 20 6f 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a   only have its j
320d0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20  ournal_mode set 
320e0 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20  to _OFF.**      
320f0 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  or _MEMORY..**.*
32100 2a 20 20 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e  *   *  The journ
32110 61 6c 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20  al mode may not 
32120 62 65 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65  be changed while
32130 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
32140 73 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  s active..**.** 
32150 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64  The returned ind
32160 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  icate the curren
32170 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
32180 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  ted) journal-mod
32190 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
321a0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64  3PagerJournalMod
321b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
321c0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
321d0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
321e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
321f0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
32200 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32210 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
32220 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  LETE.           
32230 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32240 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
32250 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20  NCATE.          
32260 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32270 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
32280 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20  RSIST.          
32290 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
322a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
322b0 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  F .            |
322c0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
322d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
322e0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  Y );.  assert( P
322f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32300 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 69 66  _QUERY<0 );.  if
32310 28 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26  ( eMode>=0.   &&
32320 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64   (!MEMDB || eMod
32330 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32340 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
32350 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
32360 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32370 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26  ALMODE_OFF).   &
32380 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  & !pPager->dbMod
32390 69 66 69 65 64 0a 20 20 20 26 26 20 28 21 69 73  ified.   && (!is
323a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
323b0 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e  ) || 0==pPager->
323c0 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b  journalOff).  ){
323d0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
323e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
323f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
32400 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
32410 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
32420 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
32430 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
32440 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
32450 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32460 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
32470 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c  t/set the size-l
32480 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65  imit used for pe
32490 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
324a0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   files..**.** Se
324b0 74 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c  tting the size l
324c0 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73  imit to -1 means
324d0 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66   no limit is enf
324e0 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74  orced..** An att
324f0 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69  empt to set a li
32500 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  mit smaller than
32510 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   -1 is a no-op..
32520 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61  */.i64 sqlite3Pa
32530 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  gerJournalSizeLi
32540 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
32550 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a  r, i64 iLimit){.
32560 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31    if( iLimit>=-1
32570 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
32580 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
32590 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   = iLimit;.  }. 
325a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
325b0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
325c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
325d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
325e0 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  he pPager->pBack
325f0 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65  up variable. The
32600 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a   backup module.*
32610 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61  * in backup.c ma
32620 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74  intains the cont
32630 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72 69  ent of this vari
32640 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c  able. This modul
32650 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61  e.** uses it opa
32660 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75  quely as an argu
32670 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
32680 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20 61  ackupRestart() a
32690 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63  nd.** sqlite3Bac
326a0 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79  kupUpdate() only
326b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63  ..*/.sqlite3_bac
326c0 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67  kup **sqlite3Pag
326d0 65 72 42 61 63 6b 75 70 50 74 72 28 50 61 67 65  erBackupPtr(Page
326e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
326f0 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42  turn &pPager->pB
32700 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66  ackup;.}..#endif
32710 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
32720 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.