/ Hex Artifact Content
Login

Artifact 5dee83c3cf4e94b72fcd81dca67abd7617227217:


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 0a 20  rDontWrite()).. 
1bee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
1bef0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
1bf00 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
1bf10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
1bf20 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
1bf30 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
1bf40 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1bf50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
1bf60 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
1bf70 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
1bf80 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1bfb0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
1bfc0 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e     ..      /* En
1bfd0 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
1bfe0 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
1bff0 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
1c000 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
1c010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c020 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
1c030 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
1c040 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
1c050 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1c060 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1c070 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
1c080 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c090 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
1c0a0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
1c0b0 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
1c0c0 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
1c0d0 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
1c0e0 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
1c0f0 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
1c100 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c110 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
1c120 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
1c130 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
1c140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1c150 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
1c160 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
1c170 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1c180 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
1c190 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1c1a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
1c1b0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
1c1c0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c1d0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
1c1e0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1c1f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c200 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c210 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1c220 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
1c230 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1c240 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
1c250 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
1c260 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
1c270 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
1c280 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1c290 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1c2a0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
1c2b0 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
1c2c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c2d0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
1c2e0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1c2f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c300 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1c310 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1c320 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1c330 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
1c340 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
1c350 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c360 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
1c370 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1c380 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
1c390 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
1c3a0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
1c3b0 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
1c3c0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1c3d0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
1c3e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c3f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c400 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  o));.    }.#ifde
1c410 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c420 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
1c430 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1c440 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c450 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
1c460 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
1c470 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
1c480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1c490 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
1c4a0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
1c4b0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
1c4c0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c4d0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
1c4e0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
1c4f0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
1c500 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1c510 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
1c520 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
1c530 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
1c540 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1c550 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1c560 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
1c570 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
1c580 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
1c590 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
1c5a0 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
1c5b0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
1c5c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1c5d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1c5e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
1c5f0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1c600 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1c610 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
1c620 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
1c630 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1c640 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c650 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
1c660 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
1c670 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
1c680 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
1c690 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
1c6a0 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
1c6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
1c6c0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
1c6d0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
1c6e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c6f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1c700 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1c710 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1c720 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76  ->sjfd) ){.    v
1c730 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
1c740 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34  ->pData;.    i64
1c750 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1c760 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
1c770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c780 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1c790 3b 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50  ;..    CODEC2(pP
1c7a0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1c7b0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
1c7c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c7d0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47  pData2);.    PAG
1c7e0 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
1c7f0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1c800 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c810 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1c820 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72  ));.  .    asser
1c830 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1c840 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
1c850 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1c860 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  gSize );.    rc 
1c870 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1c880 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
1c890 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
1c8a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c8b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c8c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c8d0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
1c8e0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c8f0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c900 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+4);.    }.  }.
1c910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c920 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1c930 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
1c940 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c950 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1c960 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
1c970 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1c980 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1c990 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1c9a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c9b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c9c0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1c9d0 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
1c9e0 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
1c9f0 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
1ca00 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
1ca10 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1ca20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1ca30 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
1ca40 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
1ca50 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
1ca60 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
1ca70 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
1ca80 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
1ca90 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
1caa0 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
1cab0 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
1cac0 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
1cad0 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
1cae0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1caf0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
1cb00 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
1cb10 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
1cb20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
1cb30 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
1cb40 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
1cb50 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
1cb60 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
1cb70 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
1cb80 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
1cb90 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
1cba0 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
1cbb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1cbc0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
1cbd0 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
1cbe0 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
1cbf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
1cc00 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cc10 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
1cc20 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
1cc30 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
1cc40 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1cc50 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
1cc60 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1cc70 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
1cc80 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
1cc90 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
1cca0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ccb0 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
1ccc0 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
1ccd0 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
1cce0 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
1ccf0 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
1cd00 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
1cd10 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1cd20 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1cd30 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1cd40 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
1cd50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cd60 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
1cd70 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
1cd80 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1cd90 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
1cda0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cdb0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1cdc0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
1cdd0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
1cde0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1cdf0 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
1ce00 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  * The doNotSync 
1ce10 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
1ce20 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  he sqlite3PagerW
1ce30 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  rite() function 
1ce40 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73  while it.  ** is
1ce50 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
1ce60 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
1ce70 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
1ce80 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
1ce90 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  .  ** on the sam
1cea0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
1ceb0 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  yncing the journ
1cec0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  al is not allowe
1ced0 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69  d while.  ** thi
1cee0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  s is happening a
1cef0 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
1cf00 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65  t that all membe
1cf10 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a  rs of such a.  *
1cf20 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61  * set of pages a
1cf30 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
1cf40 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20  k together. So, 
1cf50 69 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73  if the page this
1cf60 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
1cf70 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  s trying to make
1cf80 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75   clean will requ
1cf90 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ire a journal sy
1cfa0 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74  nc and the doNot
1cfb0 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69  Sync.  ** flag i
1cfc0 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1cfd0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1cfe0 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1cff0 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a   layer will.  **
1d000 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f   just have to go
1d010 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63   ahead and alloc
1d020 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62  ate a new page b
1d030 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66  uffer instead of
1d040 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50  .  ** reusing pP
1d050 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d  g..  **.  ** Sim
1d060 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70  ilarly, if the p
1d070 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
1d080 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
1d090 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1d0a0 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69  .  ** try to wri
1d0b0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1d0c0 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a  of pPg to disk..
1d0d0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
1d0e0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
1d0f0 29 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  ).   || (pPager-
1d100 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d110 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d120 45 45 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20  EED_SYNC).  ){. 
1d130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d140 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
1d150 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1d160 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
1d170 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  . */.  if( pPg->
1d180 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d190 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20  _SYNC ){.    rc 
1d1a0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d1b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1d1c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d1d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1d1e0 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61   && .      !(pPa
1d1f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1d200 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1d210 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
1d220 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
1d230 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1d240 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1d250 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
1d260 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
1d270 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d280 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1d290 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1d2a0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1d2b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1d2c0 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
1d2d0 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
1d2e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1d2f0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d300 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1d310 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
1d320 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
1d330 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
1d340 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68  journal..  ** Th
1d350 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
1d360 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
1d370 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
1d380 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
1d390 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
1d3a0 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
1d3b0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1d3c0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  e..  **.  ** Con
1d3d0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1d3e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
1d3f0 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a  events:.  **.  *
1d400 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
1d410 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
1d420 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d  e X>.  **     <m
1d430 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
1d440 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
1d450 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20   sp;.  **       
1d460 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
1d470 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
1d480 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67  >.  **       pag
1d490 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
1d4a0 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
1d4b0 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20  CK TO sp;.  **. 
1d4c0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1d4d0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1d4e0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1d4f0 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1d500 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75   written.  ** ou
1d510 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1d520 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
1d530 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
1d540 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
1d550 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ,.  ** following
1d560 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1d570 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
1d580 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
1d590 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64  will read.  ** d
1d5a0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
1d5b0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
1d5c0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
1d5d0 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
1d5e0 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20  t.  ** was when 
1d5f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d600 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
1d610 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
1d620 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20  EPOINT sp".  ** 
1d630 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
1d640 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  **.  ** The solu
1d650 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
1d660 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
1d670 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
1d680 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
1d690 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1d6a0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1d6b0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1d6c0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1d6d0 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
1d6e0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
1d6f0 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
1d700 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
1d710 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64  s .  ** executed
1d720 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
1d730 45 52 28 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ER(.      rc==SQ
1d740 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
1d750 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
1d760 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
1d770 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 29  resPage(pPg).  )
1d780 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62   ){.    rc = sub
1d790 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
1d7a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1d7b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d7c0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
1d7d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d7e0 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ile. */.  if( rc
1d7f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d800 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1d810 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1d820 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1d830 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
1d840 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1d850 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
1d860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d870 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
1d880 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
1d890 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1d8a0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d8b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
1d8c0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d8d0 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
1d8e0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d8f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d900 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
1d910 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1d920 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
1d930 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
1d940 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
1d950 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
1d960 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
1d970 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
1d980 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
1d990 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d9a0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
1d9b0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1d9c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1d9d0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
1d9e0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1d9f0 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
1da00 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
1da10 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
1da20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1da30 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
1da40 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
1da50 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
1da60 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
1da70 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
1da80 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1da90 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
1daa0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
1dab0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
1dac0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
1dad0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
1dae0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
1daf0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1db00 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
1db10 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1db20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
1db30 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1db40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
1db50 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
1db60 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
1db70 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1db80 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
1db90 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
1dba0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
1dbb0 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
1dbc0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
1dbd0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
1dbe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1dbf0 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
1dc00 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
1dc10 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
1dc20 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
1dc30 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
1dc40 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
1dc50 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
1dc60 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
1dc70 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
1dc80 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
1dc90 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
1dca0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
1dcb0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
1dcc0 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
1dcd0 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
1dce0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
1dcf0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
1dd00 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
1dd10 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
1dd20 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
1dd30 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
1dd40 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
1dd50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1dd60 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
1dd70 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
1dd80 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
1dd90 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
1dda0 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
1ddb0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1ddc0 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
1ddd0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
1dde0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
1ddf0 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
1de00 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
1de10 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1de20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
1de30 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1de40 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
1de50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1de60 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
1de70 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
1de80 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1de90 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
1dea0 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
1deb0 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
1dec0 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
1ded0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
1dee0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1def0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
1df00 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
1df10 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
1df20 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
1df30 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
1df40 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
1df50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
1df60 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1df70 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1df80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1df90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1dfa0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1dfb0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
1dfc0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
1dfd0 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
1dfe0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1dff0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1e000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e010 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
1e020 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
1e030 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1e040 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1e050 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
1e060 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
1e070 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
1e080 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
1e090 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
1e0a0 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
1e0b0 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
1e0c0 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
1e0d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e0e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
1e0f0 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
1e100 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
1e110 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e120 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
1e130 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e140 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
1e150 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e160 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
1e170 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
1e180 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
1e190 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
1e1a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e1b0 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
1e1c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1e1d0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
1e1e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e1f0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e200 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
1e210 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
1e220 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
1e230 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e240 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
1e250 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
1e260 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
1e270 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1e280 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e290 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
1e2a0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
1e2b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e2c0 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
1e2d0 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
1e2e0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
1e2f0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1e300 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
1e310 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
1e320 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
1e330 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
1e340 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1e350 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
1e360 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
1e370 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
1e380 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
1e390 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
1e3a0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e3b0 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
1e3c0 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
1e3d0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
1e3e0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1e3f0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
1e400 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
1e410 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1e420 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1e430 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
1e440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1e450 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
1e460 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
1e470 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e480 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
1e490 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
1e4a0 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
1e4b0 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1e4c0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1e4d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1e4e0 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
1e4f0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
1e500 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
1e510 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
1e520 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
1e530 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
1e540 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
1e550 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
1e560 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
1e570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
1e580 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
1e590 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e5a0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1e5b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
1e5c0 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
1e5d0 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
1e5e0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1e5f0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e600 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
1e610 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
1e620 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e630 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e640 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e650 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
1e660 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e670 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e680 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e690 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
1e6a0 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1e6b0 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
1e6c0 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
1e6d0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
1e6e0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
1e6f0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
1e700 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
1e710 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
1e720 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
1e730 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
1e740 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
1e750 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
1e760 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
1e770 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
1e780 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
1e790 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
1e7a0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
1e7b0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1e7c0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1e7d0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
1e7e0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
1e7f0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
1e800 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
1e810 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
1e820 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
1e830 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
1e840 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e850 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e870 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
1e880 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
1e890 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
1e8a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
1e8b0 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
1e8c0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1e8d0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1e8e0 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
1e8f0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1e900 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
1e910 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
1e920 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
1e930 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1e940 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
1e950 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
1e960 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
1e970 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
1e980 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
1e990 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1e9a0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
1e9b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e9c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1e9d0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
1e9e0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
1e9f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
1ea00 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
1ea10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
1ea20 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
1ea30 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1ea40 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
1ea50 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
1ea60 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
1ea70 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
1ea80 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
1ea90 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
1eaa0 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
1eab0 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
1eac0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
1ead0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1eae0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1eaf0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
1eb00 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
1eb10 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
1eb20 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
1eb30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1eb40 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1eb50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EN;.    }.    if
1eb60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eb70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1eb80 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1eb90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1eba0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1ebb0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
1ebc0 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
1ebd0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
1ebe0 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
1ebf0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
1ec00 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
1ec10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
1ec20 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
1ec30 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
1ec40 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
1ec50 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
1ec60 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1ec70 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
1ec80 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ec90 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
1eca0 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
1ecb0 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
1ecc0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ecd0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
1ece0 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
1ecf0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1ed00 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
1ed10 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
1ed20 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
1ed30 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
1ed40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1ed50 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
1ed60 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1ed70 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
1ed80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1ed90 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
1eda0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
1edb0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1edc0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1ede0 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
1edf0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
1ee00 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1ee10 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1ee20 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
1ee30 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
1ee40 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1ee50 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
1ee60 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1ee70 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
1ee80 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
1ee90 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
1eea0 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
1eeb0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
1eec0 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
1eed0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1eee0 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
1eef0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
1ef00 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1ef10 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
1ef20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
1ef30 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
1ef40 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1ef50 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
1ef60 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1ef70 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
1ef80 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
1ef90 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
1efa0 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65  l */.  );.  asse
1efb0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1efc0 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
1efd0 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
1efe0 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
1eff0 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1f000 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f010 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1f020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f030 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1f040 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1f050 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1f060 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1f070 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1f080 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f090 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f0a0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
1f0b0 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
1f0c0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f0d0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
1f0e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1f0f0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1f100 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f110 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
1f120 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
1f130 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
1f140 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
1f150 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f160 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f170 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
1f180 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f190 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
1f1a0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f1b0 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
1f1c0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
1f1d0 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
1f1e0 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
1f1f0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
1f200 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
1f210 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
1f220 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50  thname ){.    pP
1f230 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
1f240 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f250 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
1f260 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f270 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f280 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f290 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f2a0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
1f2b0 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
1f2c0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
1f2d0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1f2e0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
1f2f0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
1f300 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   8);.    if( pPa
1f310 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
1f320 5d 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a  ]==0 ) pPager->z
1f330 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a  Journal[0] = 0;.
1f340 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f350 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  (zPathname);.  }
1f360 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
1f370 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
1f380 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
1f390 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
1f3a0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1f3b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
1f3c0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
1f3d0 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62  ame[0] && !memDb
1f3e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
1f3f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f400 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
1f410 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
1f420 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
1f430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1f440 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
1f450 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
1f460 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
1f470 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72  s, &fout);.    r
1f480 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
1f490 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f4a0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
1f4b0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
1f4c0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
1f4d0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
1f4e0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
1f4f0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
1f500 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
1f510 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
1f520 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
1f530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f540 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
1f550 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
1f560 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
1f570 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
1f580 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f590 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
1f5a0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
1f5b0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1f5c0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1f5d0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
1f5e0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
1f5f0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
1f600 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
1f610 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1f620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f630 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
1f640 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
1f650 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f660 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
1f670 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
1f680 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1f690 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
1f6a0 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
1f6b0 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
1f6c0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
1f6d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1f6e0 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
1f6f0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
1f700 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
1f710 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f720 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
1f730 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
1f740 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f750 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1f760 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  lt = (u16)pPager
1f770 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
1f780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f790 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f7a0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1f7b0 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
1f7c0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
1f7d0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1f7e0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1f7f0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
1f800 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
1f810 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1f820 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
1f830 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
1f840 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f850 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
1f860 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
1f870 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1f880 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f890 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
1f8a0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
1f8b0 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
1f8c0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
1f8d0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1f8e0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
1f8f0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
1f900 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f910 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
1f920 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f930 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
1f940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1f950 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f960 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1f970 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
1f980 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
1f990 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
1f9a0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
1f9b0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
1f9c0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
1f9d0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
1f9e0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
1f9f0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
1fa00 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
1fa10 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
1fa20 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
1fa30 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
1fa40 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
1fa50 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
1fa60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1fa70 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
1fa80 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
1fa90 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
1faa0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
1fab0 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
1fac0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
1fad0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
1fae0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
1faf0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fb00 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
1fb10 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
1fb20 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1fb30 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1fb40 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1fb50 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
1fb60 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
1fb70 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1fb80 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
1fb90 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fba0 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
1fbb0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
1fbc0 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
1fbd0 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
1fbe0 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
1fbf0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
1fc00 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1fc10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1fc20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
1fc30 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
1fc40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fc50 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
1fc60 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
1fc70 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
1fc80 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1fc90 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
1fca0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fcb0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
1fcc0 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
1fcd0 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a  e, free the .  *
1fce0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
1fcf0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
1fd00 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
1fd10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fd20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1fd30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1fd40 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
1fd50 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1fd60 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
1fd70 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
1fd80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fd90 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
1fda0 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
1fdb0 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ect. */.  assert
1fdc0 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  ( nExtra<1000 );
1fdd0 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e  .  nExtra = ROUN
1fde0 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71  D8(nExtra);.  sq
1fdf0 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
1fe00 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
1fe10 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
1fe40 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
1fe50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
1fe60 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52  Cache);..  PAGER
1fe70 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
1fe80 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
1fe90 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
1fea0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1feb0 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
1fec0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
1fed0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
1fee0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
1fef0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1ff00 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
1ff10 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nal;.  pPager->n
1ff20 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52  oReadlock = (noR
1ff30 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
1ff40 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20  nly) ?1:0;.  /* 
1ff50 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1ff60 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
1ff70 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ff80 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
1ff90 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
1ffa0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1ffb0 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65  zeValid = (u8)me
1ffc0 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  mDb;.  /* pPager
1ffd0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
1ffe0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1fff0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
20000 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
20010 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
20020 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
20030 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
20040 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
20050 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
20060 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
20070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20080 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
20090 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
200a0 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
200b0 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
200c0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
200d0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
200e0 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
200f0 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
20100 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
20110 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
20120 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
20130 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
20140 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
20150 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
20160 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
20170 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
20180 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
20190 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
201a0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
201b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
201c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
201d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
201e0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
201f0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
20200 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
20210 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
20220 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
20230 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73  ync = 0; */.  as
20240 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
20250 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
20260 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
20270 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
20280 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
20290 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
202a0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
202b0 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
202c0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
202d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
202e0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
202f0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
20300 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
20310 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
20320 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
20330 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
20340 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
20350 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
20360 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
20370 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
20380 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
20390 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
203a0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
203b0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
203c0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
203d0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
203e0 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
203f0 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
20400 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
20410 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20420 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
20430 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
20440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20450 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
20460 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
20470 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
20480 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
20490 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
204a0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
204b0 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
204c0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
204d0 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
204e0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
204f0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
20500 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
20510 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
20520 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
20530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
20540 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20550 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
20560 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
20570 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
20580 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20590 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
205a0 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
205b0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
205c0 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
205d0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
205e0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
205f0 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
20600 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
20610 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
20620 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
20630 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
20640 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
20650 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
20660 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
20670 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
20680 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
20690 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
206a0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
206b0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
206c0 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
206d0 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
206e0 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
206f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20700 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
20710 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
20720 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
20730 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
20740 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
20750 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
20760 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
20770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20780 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
20790 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
207a0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
207b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
207c0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
207d0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
207e0 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
207f0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20800 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
20810 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
20820 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
20830 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
20840 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
20850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
20860 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
20870 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
20880 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20890 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
208a0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
208b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
208c0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
208d0 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
208e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
208f0 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
20900 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
20910 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
20920 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
20930 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
20940 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
20950 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
20960 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
20970 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
20980 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
20990 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
209a0 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
209b0 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
209c0 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
209d0 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
209e0 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
209f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20a00 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
20a10 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
20a20 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
20a30 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
20a40 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
20a50 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
20a60 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
20a70 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
20a80 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
20a90 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
20aa0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
20ab0 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
20ac0 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20ad0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20ae0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
20af0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
20b00 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
20b10 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20b20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20b30 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
20b40 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
20b50 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20b60 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
20b70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
20b80 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20b90 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
20ba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20bb0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
20bc0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
20bd0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
20be0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
20bf0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20c10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
20c20 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
20c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20c40 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
20c50 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20c60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20c70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20c80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
20c90 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
20ca0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20cb0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
20cc0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
20cd0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
20ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20cf0 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
20d00 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
20d10 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20d20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20d30 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20d40 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20d50 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20d60 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
20d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d80 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
20d90 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
20da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20db0 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
20dc0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
20dd0 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
20de0 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
20df0 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
20e00 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
20e10 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
20e20 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
20e30 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
20e40 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
20e50 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
20e60 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
20e70 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
20e80 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
20e90 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
20ea0 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
20eb0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
20ec0 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
20ed0 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
20ee0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20ef0 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
20f00 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
20f10 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
20f20 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
20f30 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
20f40 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
20f50 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
20f60 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
20f70 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
20f80 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
20f90 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
20fa0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
20fb0 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
20fc0 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
20fd0 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
20fe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
20ff0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
21000 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
21010 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
21020 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
21030 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
21040 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
21050 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
21060 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21070 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
21080 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
21090 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
210a0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
210b0 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
210c0 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
210d0 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
210e0 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
210f0 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
21100 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
21110 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
21120 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
21130 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
21140 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
21150 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
21160 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
21170 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
21180 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
21190 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
211a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
211b0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
211c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
211d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
211e0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
211f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
21200 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
21210 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21220 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
21230 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
21240 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
21250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21260 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21270 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21280 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21290 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
212a0 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
212b0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
212c0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
212d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
212e0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
212f0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
21300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
21310 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
21320 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
21330 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
21340 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
21350 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
21360 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
21370 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21380 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
21390 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
213a0 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
213b0 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
213c0 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
213d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
213e0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
213f0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
21400 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
21410 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
21420 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
21430 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
21440 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
21450 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
21460 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
21470 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21480 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
21490 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
214a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
214b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
214c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
214d0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
214e0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
214f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21510 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
21520 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
21530 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
21540 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
21550 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
21560 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21580 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21590 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
215a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
215b0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
215c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
215d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
215e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
215f0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
21600 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
21610 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
21620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
21630 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
21640 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
21650 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
21660 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
21670 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
21680 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
21690 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
216a0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
216b0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
216c0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
216d0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
216e0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
216f0 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
21700 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
21710 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
21720 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
21730 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
21740 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
21750 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
21760 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
21770 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21780 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
21790 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
217a0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
217b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
217c0 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
217d0 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
217e0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
217f0 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
21800 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
21810 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
21820 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
21830 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
21840 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21850 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
21860 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
21870 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
21880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
21890 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
218a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
218b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
218c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
218d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
218e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
218f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
21900 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
21910 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
21920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
21930 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
21940 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
21950 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
21960 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
21970 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21980 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
21990 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
219a0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
219b0 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
219c0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
219d0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
219e0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
219f0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
21a00 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21a10 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
21a20 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
21a30 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
21a40 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
21a50 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
21a60 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
21a70 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21a80 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21a90 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
21aa0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
21ab0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21ac0 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
21ad0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
21ae0 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
21af0 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
21b00 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
21b10 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
21b20 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
21b30 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21b60 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  /.  i64 iOffset;
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
21b90 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20  of file to read 
21ba0 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  from */..  asser
21bb0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21bc0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26  >=PAGER_SHARED &
21bd0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
21be0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21bf0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
21c00 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
21c10 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
21c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21c30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
21c40 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
21c50 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
21c60 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
21c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21c80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65  OK;.  }.  iOffse
21c90 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
21ca0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
21cb0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
21cc0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21cd0 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
21ce0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21cf0 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
21d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21d10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21d20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21d30 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21d40 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75  pgno==1 ){.    u
21d50 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
21d60 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
21d70 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  a)[24];.    memc
21d80 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
21d90 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
21da0 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
21db0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
21dc0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
21dd0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
21de0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
21df0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
21e00 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
21e10 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
21e20 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
21e30 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
21e40 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
21e50 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
21e60 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
21e70 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
21e80 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
21e90 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
21ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21eb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21ec0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
21ed0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
21ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21ef0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21f00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
21f10 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
21f20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21f30 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
21f40 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
21f50 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
21f60 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
21f70 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
21f80 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
21f90 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
21fa0 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
21fb0 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
21fc0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
21fd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
21fe0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
21ff0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
22000 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
22010 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
22020 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
22030 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22040 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
22050 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
22060 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  n PAGER_UNLOCK s
22070 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
22080 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
22090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
220a0 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
220b0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
220c0 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
220d0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
220e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
220f0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
22100 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
22110 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
22120 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
22130 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
22140 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
22150 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
22160 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
22170 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
22180 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
22190 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
221a0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
221b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
221c0 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
221d0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
221e0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
221f0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
22200 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22210 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
22220 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
22230 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
22240 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
22250 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
22260 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
22270 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
22280 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
22290 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
222a0 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
222b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
222c0 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
222d0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
222e0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
222f0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
22300 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
22310 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
22320 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
22330 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
22340 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
22350 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
22360 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
22370 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
22380 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
22390 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
223a0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32   described by (2
223b0 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61  ) above is not a
223c0 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66  ttempted, and if
223d0 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73   the.** pager is
223e0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
223f0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
22400 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74  LITE_FULL when t
22410 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  his is called,.*
22420 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  * the error stat
22430 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
22440 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20  returned. It is 
22450 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61  permitted to rea
22460 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
22470 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45  e when in SQLITE
22480 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74  _FULL error stat
22490 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
224a0 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
224b0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
224c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
224d0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a  turned. If an.**
224e0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
224f0 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
22500 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
22510 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
22520 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
22530 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
22540 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
22550 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
22560 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
22570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22580 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
22590 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
225a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
225b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
225c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
225d0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f   */.  int isErro
225e0 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20  rReset = 0;     
225f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
22600 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66   if recovering f
22610 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20  rom error state 
22620 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
22630 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
22640 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
22650 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
22660 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
22670 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
22680 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
22690 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
226a0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
226b0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69  Cache)==0 );.  i
226c0 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26  f( NEVER(MEMDB &
226d0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
226e0 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61  e) ){ return pPa
226f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a  ger->errCode; }.
22700 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
22710 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20  tabase is in an 
22720 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
22730 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
22740 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
22750 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
22760 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22770 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
22780 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  d rollback.  ** 
22790 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
227a0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
227b0 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  em..  */.  if( p
227c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
227d0 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
227e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
227f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
22800 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  l ){.      isErr
22810 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
22820 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
22830 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
22840 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
22850 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
22860 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
22870 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
22880 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65  OCK || isErrorRe
22890 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
228a0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
228b0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
228c0 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
228d0 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  tJournal = 0;.  
228e0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
228f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22900 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
22910 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
22920 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
22930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
22940 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
22950 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22960 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20  >readOnly );.   
22970 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22980 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
22990 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
229a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
229b0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
229c0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
229d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
229e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
229f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22a00 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
22a10 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  UNLOCK );.      
22a20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
22a30 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
22a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22a50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22a60 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
22a70 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f  D_LOCK );..    /
22a80 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
22a90 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
22aa0 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
22ab0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
22ac0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
22ad0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
22ae0 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
22af0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
22b00 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
22b10 0a 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f  .    if( !isErro
22b20 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
22b30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22b40 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
22b50 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72  HARED );.      r
22b60 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
22b70 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
22b80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
22b90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22ba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
22bb0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
22bc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
22bd0 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
22be0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
22bf0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
22c00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
22c10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22c20 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
22c30 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
22c40 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
22c50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22c60 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
22c70 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
22c80 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
22c90 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
22ca0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
22cb0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
22cc0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
22cd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
22ce0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
22cf0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
22d00 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
22d10 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
22d20 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
22d30 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
22d40 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
22d50 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
22d60 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
22d70 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
22d80 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
22d90 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
22da0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
22db0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
22dc0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
22dd0 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
22de0 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
22df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22e00 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
22e10 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
22e20 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
22e30 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
22e40 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
22e50 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
22e60 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
22e70 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
22e80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
22e90 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
22ea0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
22eb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22ec0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
22ed0 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
22ee0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
22ef0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22f00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22f10 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
22f20 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
22f30 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
22f40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22f50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22f60 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
22f70 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  VE;.      }. .  
22f80 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
22f90 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
22fa0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
22fb0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
22fc0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n .      ** excl
22fd0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
22fe0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22ff0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
23000 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
23010 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
23020 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
23030 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
23040 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
23050 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54  the.      ** OsT
23060 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
23070 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
23080 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
23090 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
230a0 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
230b0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
230c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
230d0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
230e0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
230f0 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
23100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23110 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
23120 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
23130 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
23140 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  S,&res);.       
23150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23170 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
23180 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
23190 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
231a0 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
231b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
231c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
231d0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
231e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
231f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
23200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
23210 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
23220 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
23230 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
23240 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
23250 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23260 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23270 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
23280 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
23290 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
232a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
232b0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
232c0 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
232d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
232e0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
23300 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
23310 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
23320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23340 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
23350 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
23360 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
23370 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
23380 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
23390 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
233a0 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
233b0 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
233c0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
233d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
233e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
233f0 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
23400 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
23410 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20  Or, it .        
23420 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
23430 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
23440 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
23450 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
23460 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
23470 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
23480 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
23490 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
234a0 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20   exist.  */.    
234b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
234c0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
234d0 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
234e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
234f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23520 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
23530 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
23540 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65  ODO: Why are the
23550 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f  se cleared here?
23560 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79   Is it necessary
23570 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ? */.      pPage
23580 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
23590 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
235a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
235b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
235c0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
235d0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
235e0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
235f0 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
23600 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
23610 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
23620 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
23630 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
23640 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
23650 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
23660 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
23670 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
23680 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
23690 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
236a0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
236b0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
236c0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
236d0 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  nt cache..      
236e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
236f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
23700 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23710 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
23720 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
23730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23750 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
23760 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
23770 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23780 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
23790 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
237a0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
237b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
237c0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20  ARED).          
237d0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
237e0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
237f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
23800 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
23810 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
23820 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
23830 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
23840 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
23850 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
23860 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
23870 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
23880 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
23890 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
238a0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
238b0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
238c0 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
238d0 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
238e0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
238f0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
23900 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
23910 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23920 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
23930 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
23940 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
23950 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
23960 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
23970 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
23980 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
23990 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
239a0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
239b0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
239c0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
239d0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
239e0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
239f0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
23a00 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
23a10 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
23a20 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
23a30 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
23a40 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
23a50 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
23a60 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
23a70 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
23a80 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
23a90 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
23aa0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
23ab0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
23ac0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
23ad0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
23ae0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
23af0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
23b00 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
23b10 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
23b20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
23b30 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
23b40 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
23b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
23b60 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
23b70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23b80 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
23b90 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
23ba0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
23bb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
23bc0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
23bd0 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
23be0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23c00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23c10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
23c20 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
23c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23c40 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
23c50 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
23c60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
23c70 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
23c80 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
23c90 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
23ca0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
23cb0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
23cc0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
23cd0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
23ce0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
23cf0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
23d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
23d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23d20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23d30 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23d40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23d50 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
23d60 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
23d70 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
23d80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
23d90 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
23da0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
23db0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
23dc0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
23dd0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
23de0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
23df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23e10 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
23e20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
23e30 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
23e40 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
23e50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23e60 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
23e70 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
23e80 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
23e90 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
23ea0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23eb0 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
23ec0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
23ed0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
23ef0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
23f00 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
23f10 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
23f20 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
23f30 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
23f40 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
23f50 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
23f60 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
23f70 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
23f80 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
23f90 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
23fa0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
23fb0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
23fc0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
23fd0 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
23fe0 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
23ff0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
24000 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
24010 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
24020 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
24030 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
24040 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
24050 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24060 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
24070 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
24080 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
24090 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
240a0 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61  >0) .  ){.    pa
240b0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
240c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
240d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
240e0 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
240f0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
24100 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
24110 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
24120 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
24130 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
24140 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
24150 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
24160 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
24170 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
24180 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
24190 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
241a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
241b0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
241c0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
241d0 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
241e0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
241f0 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
24200 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
24210 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
24220 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
24230 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
24240 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24250 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
24260 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
24270 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
24280 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
24290 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
242a0 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
242b0 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
242c0 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
242d0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
242e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
242f0 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
24300 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
24310 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
24320 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
24330 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
24340 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
24350 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
24360 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
24370 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
24380 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
24390 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
243a0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
243b0 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
243c0 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
243d0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
243e0 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
243f0 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
24400 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
24410 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
24420 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
24430 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
24440 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
24450 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
24460 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
24470 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
24480 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
24490 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
244a0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
244b0 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
244c0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
244d0 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
244e0 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
244f0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
24500 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
24510 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
24520 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
24530 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
24540 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
24550 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
24560 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
24570 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
24580 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
24590 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
245a0 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
245b0 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
245c0 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
245d0 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
245e0 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
245f0 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
24600 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
24610 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
24620 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
24630 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
24640 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
24650 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61   cache to popula
24660 74 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  te with the data
24670 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
24680 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
24690 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
246a0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
246b0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
246c0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
246d0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
246e0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
246f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24700 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
24710 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
24720 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
24730 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
24740 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
24750 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
24760 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
24770 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
24780 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
24790 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
247a0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
247b0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
247c0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
247d0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
247e0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
247f0 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
24800 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
24810 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
24820 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
24830 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
24840 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
24850 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
24860 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
24870 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
24880 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
24890 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
248a0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
248b0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
248c0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
248d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
248e0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
248f0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
24900 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
24910 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
24920 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
24930 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
24940 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
24950 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
24960 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
24970 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
24980 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
24990 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
249a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
249b0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
249c0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
249d0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
249e0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
249f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
24a00 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
24a10 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
24a20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
24a30 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
24a40 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
24a50 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
24a60 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
24a70 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
24a80 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
24a90 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
24aa0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
24ab0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
24ac0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
24ad0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
24ae0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
24af0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
24b00 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
24b10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24b20 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
24b30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
24b40 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
24b50 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
24b60 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
24b70 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
24b80 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
24b90 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
24ba0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
24bb0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
24bc0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
24bd0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
24be0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
24bf0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
24c00 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
24c10 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
24c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24c30 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
24c40 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
24c50 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
24c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24c70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24c80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
24c90 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
24ca0 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
24cb0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
24cc0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
24cd0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
24ce0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
24cf0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
24d00 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
24d10 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
24d20 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
24d30 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
24d40 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
24d50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24d60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24d70 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
24d80 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
24d90 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
24da0 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
24db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24dc0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
24dd0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
24de0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
24df0 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
24e00 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
24e10 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
24e20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
24e30 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
24e40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
24e50 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
24e60 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
24e70 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
24e80 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
24e90 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
24ea0 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
24eb0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
24ec0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
24ed0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
24ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
24ef0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
24f00 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
24f10 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
24f20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
24f30 67 65 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  ge)->pPager ){. 
24f40 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
24f50 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
24f60 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
24f70 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
24f80 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
24f90 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
24fa0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
24fb0 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
24fc0 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
24fd0 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
24fe0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
24ff0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
25000 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
25010 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
25020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
25030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
25040 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
25050 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
25060 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
25070 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
25080 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
25090 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ed.  */.    int 
250a0 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52  nMax;..    PAGER
250b0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
250c0 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  iss);.    pPg = 
250d0 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
250e0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
250f0 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
25100 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
25110 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
25120 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25130 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
25140 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
25150 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
25160 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
25170 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
25180 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
25190 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
251a0 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
251b0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
251c0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
251d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
251e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
251f0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
25200 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
25210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25220 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
25230 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20  er, &nMax);.    
25240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25250 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
25260 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25270 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
25280 28 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c  ( MEMDB || nMax<
25290 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43  (int)pgno || noC
252a0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
252b0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
252c0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d  >mxPgno ){..rc =
252d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67   SQLITE_FULL;..g
252e0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
252f0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
25300 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
25310 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
25320 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
25330 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
25340 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
25350 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
25360 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
25370 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
25380 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
25390 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
253a0 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
253b0 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
253c0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
253d0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
253e0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
253f0 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
25400 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
25410 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
25420 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
25430 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
25440 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
25450 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
25460 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
25470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25480 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
25490 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
254a0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
254b0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
254c0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
254d0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
254e0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
254f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
25500 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
25510 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
25520 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
25530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
25540 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
25550 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
25560 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
25570 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
25580 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25590 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
255a0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
255b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
255c0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
255d0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
255e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
255f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
25600 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
25610 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
25620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25630 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
25640 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
25650 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
25660 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
25670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25690 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
256a0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
256b0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
256c0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
256d0 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
256e0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
256f0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
25700 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25710 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
25720 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
25730 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
25740 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
25750 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
25760 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
25770 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
25780 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
25790 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
257a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
257b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
257c0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
257d0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
257e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
257f0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
25800 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
25810 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
25820 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25830 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
25840 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25850 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c   in cache. Also,
25860 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
25870 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e   .** pager is in
25880 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
25890 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
258a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
258b0 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70  ,.** or if the p
258c0 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
258d0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
258e0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
258f0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
25900 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
25910 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
25920 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
25930 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
25940 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
25950 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
25960 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
25970 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
25980 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
25990 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
259a0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
259b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
259c0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
259d0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
259e0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
259f0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
25a00 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
25a10 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
25a20 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
25a30 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
25a40 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
25a50 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
25a60 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
25a70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
25a80 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
25a90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25aa0 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
25ab0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25ac0 72 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52  r->state > PAGER
25ad0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c  _UNLOCK );.  sql
25ae0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
25af0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25b00 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
25b10 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
25b20 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
25b30 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
25b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
25b50 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
25b60 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
25b70 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
25b80 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
25b90 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
25ba0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
25bb0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
25bc0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
25bd0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
25be0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
25bf0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
25c00 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
25c10 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
25c20 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
25c30 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
25c40 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
25c50 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
25c60 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
25c70 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
25c80 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
25c90 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
25ca0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
25cb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
25cc0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
25cd0 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64   file has alread
25ce0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65  y been opened, e
25cf0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a  nsure that the.*
25d00 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
25d10 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20  le is open too. 
25d20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
25d30 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  nal is not open,
25d40 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
25d50 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
25d60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
25d70 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
25d80 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
25d90 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
25da0 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f  .** An SQLITE_IO
25db0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
25dc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
25dd0 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20  f a call to .** 
25de0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
25df0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
25e00 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
25e10 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
25e20 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
25e30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25e40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25e50 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
25e60 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
25e70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
25e80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
25e90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
25ea0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
25eb0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
25ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
25ed0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
25ee0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
25ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
25f00 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
25f10 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
25f20 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
25f30 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
25f40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25f50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
25f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25f70 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
25f80 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
25f90 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
25fa0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
25fb0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
25fc0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
25fd0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
25fe0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
25ff0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26000 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
26010 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
26020 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
26030 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
26040 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
26050 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
26060 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
26070 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
26080 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
26090 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
260a0 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
260b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
260c0 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
260d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
260e0 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
260f0 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
26100 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
26110 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
26120 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
26130 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
26140 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
26150 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
26160 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
26170 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
26180 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
26190 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
261a0 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
261b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
261c0 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
261d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
261e0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
261f0 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
26200 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
26210 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
26220 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26230 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
26240 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
26250 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
26260 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
26270 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
26280 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
26290 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
262a0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
262b0 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
262c0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
262d0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
262e0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
262f0 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
26300 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
26310 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
26320 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
26330 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
26340 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
26350 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
26360 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
26370 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26380 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
26390 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
263c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
263d0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
263e0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
263f0 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
26400 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
26410 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26420 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
26430 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
26440 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
26450 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
26460 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
26470 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
26480 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
26490 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  F );.  assert( p
264a0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
264b0 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
264c0 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
264d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
264e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
264f0 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
26500 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
26510 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
26520 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
26530 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
26540 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
26550 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
26560 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
26570 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
26580 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
26590 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44  rCode;..  /* TOD
265a0 4f 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20  O: Is it really 
265b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20  possible to get 
265c0 68 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65  here with dbSize
265d0 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74  Valid==0? If not
265e0 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20  ,.  ** the call 
265f0 74 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e  to PagerPagecoun
26600 74 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76  t() can be remov
26610 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ed..  */.  testc
26620 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ase( pPager->dbS
26630 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  izeValid==0 );. 
26640 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
26650 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
26660 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  );..  pPager->pI
26670 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
26680 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
26690 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
266a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
266b0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
266c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
266d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
266e0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
266f0 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
26700 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
26710 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  n. */.  if( !isO
26720 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26730 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
26740 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
26750 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26760 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
26770 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
26780 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
26790 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
267a0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
267b0 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
267c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
267d0 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
267e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
267f0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
26800 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
26810 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
26820 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  E|.        (pPag
26830 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
26840 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
26850 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
26860 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
26870 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
26880 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
26890 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
268a0 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  NAL).        );.
268b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
268c0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
268d0 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  E.      rc = sql
268e0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
268f0 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c  .          pVfs,
26900 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
26910 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
26920 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
26930 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
26940 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
26950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26960 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
26970 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
26980 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
26990 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
269a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
269b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
269c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
269d0 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  fd) );.  }...  /
269e0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
269f0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
26a00 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26a10 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
26a20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
26a30 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
26a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
26a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26a60 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
26a70 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
26a80 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
26a90 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ired. */.    pPa
26aa0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
26ab0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
26ac0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
26ad0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
26ae0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
26af0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
26b00 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
26b10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
26b20 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
26b30 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
26b40 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
26b50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
26b60 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  = 0;.    rc = wr
26b70 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
26b80 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
26b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26ba0 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
26bb0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  oint ){.    rc =
26bc0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
26bd0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
26be0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26bf0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
26c00 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
26c10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26c20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
26c30 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
26c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26c50 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
26c60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
26c70 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
26c80 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
26c90 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
26ca0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
26cb0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
26cc0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
26cd0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
26ce0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
26cf0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
26d00 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
26d10 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
26d20 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
26d30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26d40 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
26d50 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
26d60 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
26d70 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
26d80 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
26d90 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
26da0 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
26db0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
26dc0 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
26dd0 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e  .** If this is n
26de0 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
26df0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
26e00 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61   and, the journa
26e10 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70  l file is .** op
26e20 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e  ened if it has n
26e30 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e  ot been already.
26e40 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   For a temporary
26e50 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69   file, the openi
26e60 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  ng .** of the jo
26e70 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
26e80 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
26e90 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20  re is an actual 
26ea0 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74  need to .** writ
26eb0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
26ec0 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64  . TODO: Why hand
26ed0 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
26ee0 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a  es differently?.
26ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
26f00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
26f10 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73  ned (or if it is
26f20 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20   already open), 
26f30 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  then a.** journa
26f40 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l-header is writ
26f50 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74  ten to the start
26f60 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   of it..**.** If
26f70 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
26f80 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
26f90 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
26fa0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
26fb0 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
26fc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
26fd0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
26fe0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
26ff0 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
27000 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
27010 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
27020 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
27030 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
27040 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
27050 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
27060 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
27070 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
27080 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
27090 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
270a0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
270b0 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
270c0 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
270d0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
270e0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
270f0 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
27100 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
27110 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
27120 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
27130 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
27140 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
27150 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
27160 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
27170 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
27180 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
27190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
271a0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
271b0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
271c0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50  R_UNLOCK );.  pP
271d0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
271e0 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
271f0 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61  emory;.  if( pPa
27200 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
27210 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  R_SHARED ){.    
27220 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27230 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
27240 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
27250 4d 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e  MDB && !pPager->
27260 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20  tempFile );..   
27270 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
27280 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
27290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
272a0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
272b0 61 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20  arameter.    ** 
272c0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
272d0 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
272e0 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
272f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
27300 0a 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e  .    ** busy-han
27310 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
27320 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
27330 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
27340 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a  EXCLUSIVE.    **
27350 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
27360 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
27370 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
27380 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
27390 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
273a0 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
273b0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  VED_LOCK);.    i
273c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
273d0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
273e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
273f0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
27400 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
27410 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27420 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
27430 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
27440 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
27450 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
27460 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
27470 6b 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66  ks were successf
27480 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f  ully obtained, o
27490 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  pen the journal.
274a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20      ** file and 
274b0 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
274c0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74  journal-header t
274d0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
274e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
274f0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
27500 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
27510 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
27520 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
27530 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
27540 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
27550 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f  .  }else if( isO
27560 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27570 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27580 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
27590 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
275a0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
275b0 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
275c0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
275d0 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
275e0 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
275f0 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
27600 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
27610 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
27620 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
27630 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
27640 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
27650 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
27660 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
27670 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77  pen and either w
27680 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
27690 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68  0 bytes or its h
276a0 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a  eader was.    **
276b0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
276c0 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
276d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
276e0 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
276f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27700 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
27710 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27720 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
27730 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
27740 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
27750 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
27760 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
27770 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
27780 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27790 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74  ger)));.  assert
277a0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
277b0 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
277c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
277d0 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
277e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
277f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
27800 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
27810 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
27820 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49   /* Ignore any I
27830 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  O error that occ
27840 75 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72  urs within pager
27850 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
27860 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  (). The.    ** p
27870 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
27880 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20  all is to reset 
27890 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
278a0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a  te of the pager.
278b0 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
278c0 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
278d0 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
278e0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
278f0 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20  properly.    ** 
27900 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69  finalized at thi
27910 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69  s point (since i
27920 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
27930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
27940 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  yway)..    */.  
27950 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
27960 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
27970 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
27980 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
27990 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
279a0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
279b0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
279c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
279d0 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
279e0 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
279f0 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
27a00 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
27a10 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
27a20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
27a30 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
27a40 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
27a50 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
27a60 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
27a70 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
27a80 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
27a90 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
27aa0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
27ab0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
27ac0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
27ad0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
27ae0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
27af0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
27b00 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
27b10 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
27b20 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
27b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27b40 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
27b50 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
27b60 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
27b70 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
27b80 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72  y been.  ** star
27b90 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
27ba0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27bb0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
27bc0 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  D );..  /* If an
27bd0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
27be0 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
27bf0 74 65 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e  ted, we should n
27c00 6f 74 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69  ot be.  ** calli
27c10 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
27c20 20 20 52 65 70 65 61 74 20 74 68 65 20 65 72 72    Repeat the err
27c30 6f 72 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  or for robustnes
27c40 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
27c50 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
27c60 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70  ode) )  return p
27c70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
27c80 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76  .  /* Higher-lev
27c90 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65  el routines neve
27ca0 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  r call this func
27cb0 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65  tion if database
27cc0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69   is not.  ** wri
27cd0 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63  table.  But chec
27ce0 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66  k anyway, just f
27cf0 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  or robustness. *
27d00 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
27d10 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ager->readOnly) 
27d20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27d30 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28  PERM;..  assert(
27d40 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
27d50 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
27d60 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
27d70 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
27d80 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
27d90 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
27da0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
27db0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
27dc0 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
27dd0 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
27de0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
27df0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
27e00 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
27e10 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
27e20 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
27e30 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
27e40 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
27e50 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
27e60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
27e70 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
27e80 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
27e90 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
27ea0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
27eb0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
27ec0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
27ed0 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
27ee0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
27ef0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
27f00 2a 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  * Higher level r
27f10 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68  outines should h
27f20 61 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72  ave already star
27f30 74 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ted a transactio
27f40 6e 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  n,.    ** which 
27f50 6d 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20  means they have 
27f60 61 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63  acquired the nec
27f70 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 61 6e 64  essary locks and
27f80 20 6f 70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 61   opened.    ** a
27f90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
27fa0 6c 2e 20 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b  l.  Double-check
27fb0 20 74 6f 20 6d 61 6b 65 73 20 73 75 72 65 20 74   to makes sure t
27fc0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
27fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
27fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
27ff0 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50  in(pPager, 0, pP
28000 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
28010 72 79 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  ry);.    if( NEV
28020 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  ER(rc!=SQLITE_OK
28030 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
28040 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28050 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
28060 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
28070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
28080 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
28090 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
280a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
280b0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
280c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
280d0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
280e0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
280f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28100 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
28110 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
28120 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20  dified = 1;.  . 
28130 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
28140 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
28150 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
28160 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
28170 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
28180 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
28190 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
281a0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
281b0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
281c0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
281d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
281e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
281f0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
28200 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
28210 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
28220 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
28230 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
28240 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
28250 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
28260 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  e ){.        u32
28270 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
28280 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
28290 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
282a0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
282b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
282c0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
282d0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
282e0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
282f0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
28300 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
28310 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
28320 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
28330 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
28340 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
28350 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
28360 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
28370 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
28380 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
28390 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
283a0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
283b0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
283c0 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
283d0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
283e0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
283f0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
28400 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
28420 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
28430 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28460 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28470 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
28480 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
284b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
284c0 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
284d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
284e0 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
284f0 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
28500 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28530 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
28540 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
28550 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
28560 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
28570 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28580 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
28590 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
285a0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
285b0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
285c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
285f0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
28600 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
28610 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
28620 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
28630 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
28640 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
28650 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
28660 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
28670 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
28680 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
28690 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
286a0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
286b0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
286c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
286d0 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
286e0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
286f0 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
28700 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
28710 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ll error occurre
28720 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  d while journall
28730 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
28740 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
28750 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
28760 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
28770 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
28780 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
28790 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
287a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
287b0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
287c0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
287d0 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
287e0 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
287f0 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
28800 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
28810 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
28820 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28830 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
28840 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
28850 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
28860 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
28870 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
28880 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
28890 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
288a0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
288b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
288c0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
288d0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
288e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
288f0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
28900 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
28910 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
28920 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74  curred writing t
28930 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28940 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
28950 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
28960 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
28970 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
28980 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
28990 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
289a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
289b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
289c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
289d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
289e0 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
289f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28a00 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
28a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28a20 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
28a30 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
28a40 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
28a50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
28a70 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
28a80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28a90 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
28aa0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
28ab0 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
28ac0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
28ad0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
28ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28af0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28b00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
28b20 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
28b30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28b40 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
28b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
28b60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
28b70 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
28b80 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
28b90 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
28ba0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
28bb0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
28bc0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
28bd0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
28be0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28bf0 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
28c00 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
28c10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28c20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
28c30 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
28c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c50 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
28c60 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
28c70 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
28c80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
28c90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
28ca0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
28cb0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
28cc0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
28cd0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
28ce0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
28cf0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
28d00 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
28d10 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
28d20 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
28d30 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
28d40 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
28d50 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
28d60 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
28d70 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
28d80 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
28d90 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
28da0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
28db0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
28dc0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
28dd0 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
28de0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
28df0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
28e00 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
28e10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
28e20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
28e30 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
28e40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
28e50 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
28e60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
28e70 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
28e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
28ea0 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
28eb0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
28ec0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
28ed0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
28ee0 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
28ef0 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
28f00 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
28f10 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
28f20 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
28f30 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
28f40 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
28f50 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
28f60 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
28f70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
28f80 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
28f90 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
28fa0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
28fb0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
28fc0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
28fd0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
28fe0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
28ff0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
29000 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
29010 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
29020 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
29030 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
29040 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
29050 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
29060 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
29070 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
29080 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
29090 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
290a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
290b0 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
290c0 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
290d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
290e0 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
290f0 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
29100 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
29110 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29120 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
29130 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
29140 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
29150 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
29160 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
29170 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
29180 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
29190 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
291a0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
291b0 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
291c0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  ize);..  if( nPa
291d0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
291e0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
291f0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
29200 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
29210 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
29220 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
29230 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
29240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
29250 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
29260 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
29270 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
29280 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
29290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
292a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
292b0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
292c0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
292d0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
292e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
292f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
29300 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
29310 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
29320 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
29330 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
29340 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
29350 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
29360 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
29370 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
29380 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
29390 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
293a0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
293b0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
293c0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
293d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
293e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
293f0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
29400 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
29410 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
29420 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
29430 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
29440 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
29450 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
29460 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
29470 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
29480 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
29490 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
294a0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
294b0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
294c0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
294d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
294e0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
294f0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
29500 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
29510 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
29520 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
29530 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
29540 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
29550 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28  ecount(pPager, (
29560 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e  int *)&nPageCoun
29570 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  t);.    if( pPg-
29580 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
29590 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
295a0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
295b0 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
295c0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
295d0 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
295e0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
295f0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
29600 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
29610 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
29620 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
29630 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
29640 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
29650 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
29660 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
29670 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
29680 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
29690 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
296a0 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
296b0 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
296c0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
296d0 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
296e0 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
296f0 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
29700 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
29710 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
29720 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
29730 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29740 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
29750 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
29760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29770 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
29780 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
29790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
297a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
297b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
297c0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
297d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
297e0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
297f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
29800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29810 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
29830 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
29840 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
29850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29860 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
29870 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
29880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29890 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
298a0 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
298b0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
298c0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
298d0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
298e0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
298f0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
29900 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
29910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29920 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29930 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29940 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
29950 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
29960 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
29970 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
29980 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
29990 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
299a0 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
299b0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
299c0 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
299d0 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
299e0 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
299f0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
29a00 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
29a10 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
29a20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
29a30 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
29a40 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
29a50 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
29a60 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
29a70 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
29a80 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
29a90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29aa0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29ac0 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  & needSync ){.  
29ad0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
29ae0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f  DB && pPager->no
29af0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
29b00 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
29b10 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
29b20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
29b30 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
29b40 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
29b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
29b60 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
29b70 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
29b80 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
29b90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29ba0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
29bb0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
29bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
29bd0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
29be0 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
29bf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29c00 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
29c10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
29c20 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
29c30 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
29c40 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
29c50 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
29c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29c70 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
29c80 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
29c90 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
29ca0 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
29cb0 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
29cc0 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
29cd0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
29ce0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
29cf0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
29d00 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
29d10 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
29d20 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
29d30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
29d40 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
29d50 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
29d60 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
29d70 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
29d80 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
29d90 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
29da0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
29db0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
29dc0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
29dd0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
29de0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
29df0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
29e00 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
29e10 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
29e20 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
29e30 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
29e40 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
29e50 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
29e60 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
29e70 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
29e80 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
29e90 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
29ea0 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
29eb0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
29ec0 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
29ed0 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
29ee0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
29ef0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
29f00 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
29f10 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
29f20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
29f30 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
29f40 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
29f50 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
29f60 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
29f70 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
29f80 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
29f90 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
29fa0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
29fb0 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
29fc0 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
29fd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
29fe0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
29ff0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2a000 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2a010 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
2a020 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2a030 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
2a040 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
2a050 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2a060 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
2a070 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
2a080 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
2a090 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2a0a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
2a0b0 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
2a0c0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2a0d0 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
2a0e0 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
2a0f0 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  RITE;.#ifdef SQL
2a100 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2a110 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
2a120 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
2a130 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
2a140 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2a150 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2a160 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
2a170 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2a180 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a190 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
2a1a0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
2a1b0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2a1c0 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
2a1d0 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
2a1e0 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
2a1f0 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  pager file..**.*
2a200 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63  * If the isDirec
2a210 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65  tMode flag is ze
2a220 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  ro, then this is
2a230 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67   done by calling
2a240 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
2a250 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65  rWrite() on page
2a260 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69   1, then modifyi
2a270 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2a280 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64  of the.** page d
2a290 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ata. In this cas
2a2a0 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  e the file will 
2a2b0 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20  be updated when 
2a2c0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
2a2d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2a2e0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
2a2f0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2a300 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65  flag may only be
2a310 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2a320 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
2a330 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  piled.** with th
2a340 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2a350 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63  ATOMIC_WRITE mac
2a360 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74  ro defined. In t
2a370 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20  his case,.** if 
2a380 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d  isDirect is non-
2a390 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
2a3a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2a3b0 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79  updated directly
2a3c0 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61  .** by writing a
2a3d0 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f  n updated versio
2a3e0 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e  n of page 1 usin
2a3f0 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  g a call to the 
2a400 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69  .** sqlite3OsWri
2a410 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  te() function..*
2a420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2a430 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2a440 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
2a450 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
2a460 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63  tMode){.  int rc
2a470 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2a480 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
2a490 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
2a4a0 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
2a4b0 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
2a4c0 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
2a4d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2a4e0 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
2a4f0 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
2a500 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
2a510 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
2a520 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
2a530 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
2a540 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
2a550 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2a560 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
2a570 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
2a580 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
2a590 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2a5a0 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
2a5b0 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2a5c0 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
2a5d0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2a5e0 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
2a5f0 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
2a600 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
2a610 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
2a620 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
2a630 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
2a640 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
2a650 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
2a660 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
2a670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
2a680 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2a690 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
2a6a0 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74  _MODE 0.  assert
2a6b0 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d  ( isDirectMode==
2a6c0 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
2a6d0 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74  RAMETER(isDirect
2a6e0 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64  Mode);.#else.# d
2a6f0 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
2a700 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23  E isDirectMode.#
2a710 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2a720 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2a730 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2a740 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2a750 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2a760 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2a770 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64  ze>0 ){.    PgHd
2a780 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
2a790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
2a7a0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2a7b0 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e   */.    u32 chan
2a7c0 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  ge_counter;     
2a7d0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2a7e0 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65   value of change
2a7f0 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a  -counter field *
2a800 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2a810 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2a820 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2a830 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
2a840 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
2a850 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
2a860 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
2a870 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2a880 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
2a890 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
2a8a0 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
2a8b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a8c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
2a8d0 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
2a8e0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
2a8f0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
2a900 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
2a910 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
2a920 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
2a930 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20  age 1 writable. 
2a940 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20   When not in .  
2a950 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65    ** direct mode
2a960 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61  , page 1 is alwa
2a970 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  ys held in cache
2a980 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50   and hence the P
2a990 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a  agerGet().    **
2a9a0 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73   above is always
2a9b0 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65   successful - he
2a9c0 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f  nce the ALWAYS o
2a9d0 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e  n rc==SQLITE_OK.
2a9e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2a9f0 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20  !DIRECT_MODE && 
2aa00 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54  ALWAYS(rc==SQLIT
2aa10 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  E_OK) ){.      r
2aa20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2aa30 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
2aa40 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
2aa50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2aa60 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
2aa70 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
2aa80 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
2aa90 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
2aaa0 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  24. */.      cha
2aab0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
2aac0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
2aad0 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
2aae0 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68  eVers);.      ch
2aaf0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
2ab00 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
2ab10 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
2ab20 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
2ab30 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
2ab40 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
2ab50 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
2ab60 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
2ab70 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
2ab80 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
2ab90 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
2aba0 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
2abb0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
2abc0 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
2abd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2abe0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2abf0 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
2ac00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2ac10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2ac20 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2ac30 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2ac40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ac50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ac60 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
2ac70 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
2ac80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ac90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2aca0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2acb0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2acc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2acd0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
2ace0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
2acf0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
2ad00 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
2ad10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ad20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2ad30 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
2ad40 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
2ad50 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
2ad60 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
2ad70 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
2ad80 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
2ad90 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
2ada0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
2adb0 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
2adc0 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
2add0 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
2ade0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
2adf0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
2ae00 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
2ae10 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ae20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2ae30 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2ae40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ae50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2ae80 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
2ae90 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
2aea0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2aeb0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
2aec0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2aed0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2aee0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2aef0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2af00 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
2af10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2af20 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
2af30 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
2af40 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
2af50 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
2af60 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
2af70 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
2af80 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
2af90 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
2afa0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
2afb0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
2afc0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
2afd0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
2afe0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2aff0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
2b000 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
2b010 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
2b020 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
2b030 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2b040 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
2b050 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2b060 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
2b070 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
2b080 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
2b090 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
2b0a0 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
2b0b0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2b0c0 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
2b0d0 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
2b0e0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
2b0f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b100 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
2b110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b120 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
2b130 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
2b140 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
2b150 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
2b160 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
2b170 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
2b180 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
2b190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2b1a0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
2b1b0 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
2b1c0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
2b1d0 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
2b1e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
2b1f0 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
2b200 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b210 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
2b220 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
2b230 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
2b240 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
2b250 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
2b260 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
2b270 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
2b280 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2b290 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
2b2a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2b2b0 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
2b2c0 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
2b2d0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
2b2e0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2b2f0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
2b300 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
2b310 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
2b320 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
2b330 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
2b340 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b350 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2b360 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
2b370 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
2b380 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
2b390 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2b3a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b3b0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
2b3c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2b3f0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2b400 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
2b410 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
2b420 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
2b430 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
2b440 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
2b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b460 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2b470 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
2b480 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
2b490 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2b4a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2b4b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2b4c0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
2b4d0 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e   dbOrigSize is n
2b4e0 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72  ever set if jour
2b4f0 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a  nal_mode=OFF */.
2b500 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b510 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2b520 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b530 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e  _OFF || pPager->
2b540 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
2b550 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
2b560 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
2b570 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
2b580 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2b590 6c 65 64 2e 20 20 52 4f 4c 4c 42 41 43 4b 0a 20  led.  ROLLBACK. 
2b5a0 20 2a 2a 20 69 73 20 74 68 65 20 61 70 70 72 6f   ** is the appro
2b5b0 70 72 69 61 74 65 20 72 65 73 70 6f 6e 73 65 20  priate response 
2b5c0 74 6f 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74  to an error, not
2b5d0 20 43 4f 4d 4d 49 54 2e 20 20 47 75 61 72 64 20   COMMIT.  Guard 
2b5e0 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 63 6f 64  against.  ** cod
2b5f0 69 6e 67 20 65 72 72 6f 72 73 20 62 79 20 72 65  ing errors by re
2b600 70 65 61 74 69 6e 67 20 74 68 65 20 70 72 69 6f  peating the prio
2b610 72 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66  r error. */.  if
2b620 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b630 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2b640 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2b650 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
2b660 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
2b670 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
2b680 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
2b690 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
2b6a0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
2b6b0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
2b6c0 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45  ize));..  if( ME
2b6d0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
2b6e0 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20  bModified ){.   
2b6f0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2b700 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
2b710 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
2b720 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2b730 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a  , or this.    **
2b740 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
2b750 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2b760 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20  d, it is mostly 
2b770 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65  a no-op.  Howeve
2b780 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61  r, any.    ** ba
2b790 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73  ckup in progress
2b7a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
2b7b0 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tarted..    */. 
2b7c0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2b7d0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
2b7e0 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
2b7f0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
2b800 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
2b810 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  D && pPager->dbM
2b820 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20  odified ){..    
2b830 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2b840 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
2b850 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2b860 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
2b870 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68  t.    ** does th
2b880 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
2b890 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2b8a0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
2b8b0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2b8c0 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
2b8d0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2b8e0 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
2b8f0 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
2b900 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  e .    ** runtim
2b910 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
2b920 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
2b930 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2b940 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79     * The file-sy
2b950 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
2b960 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
2b970 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
2b980 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
2b990 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
2b9a0 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20  , and .    **   
2b9b0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
2b9c0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
2b9d0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
2b9e0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2b9f0 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
2ba00 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
2ba10 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
2ba20 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
2ba30 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
2ba40 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
2ba50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
2ba60 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
2ba70 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2ba80 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
2ba90 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2baa0 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
2bab0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
2bac0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
2bad0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69      ** counter i
2bae0 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65  n 'indirect-mode
2baf0 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  '. If the optimi
2bb00 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  zation is compil
2bb10 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a  ed in but.    **
2bb20 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62   is not applicab
2bb30 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73  le to this trans
2bb40 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c  action, call sql
2bb50 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2bb60 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e().    ** to ma
2bb70 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
2bb80 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
2bb90 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
2bba0 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
2bbb0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2bbc0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2bbd0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2bbe0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
2bbf0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20  indirect.    ** 
2bc00 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  mode. .    **.  
2bc10 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2bc20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2bc30 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
2bc40 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
2bc50 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  le,.    ** then 
2bc60 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
2bc70 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2bc80 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2bc90 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
2bca0 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20   ** in 'direct' 
2bcb0 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2bcc0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2bcd0 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ile will never b
2bce0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2bcf0 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
2bd00 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  ction..    */.#i
2bd10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2bd20 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2bd30 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
2bd40 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2bd50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2bd60 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2bd70 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2bd80 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2bd90 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
2bda0 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
2bdb0 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26  er->jfd) .     &
2bdc0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2bdd0 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
2bde0 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
2bdf0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2be00 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Size>=pPager->db
2be10 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26  FileSize.     &&
2be20 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
2be30 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2be40 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2be50 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
2be60 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20  pDirty).    ){. 
2be70 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2be80 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
2be90 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
2bea0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
2beb0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
2bec0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
2bed0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
2bee0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
2bef0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2bf00 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2bf10 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2bf20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
2bf30 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
2bf40 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
2bf50 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
2bf60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2bf70 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
2bf80 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2bf90 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  e .      ** prop
2bfa0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
2bfb0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
2bfc0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
2bfd0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2bfe0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2bff0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2c000 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
2c010 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c020 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2c030 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2c040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c060 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c070 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c080 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2c090 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20   }.    }.#else. 
2c0a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2c0b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c0c0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e  (pPager, 0);.#en
2c0d0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
2c0e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c0f0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c100 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2c110 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
2c120 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
2c130 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
2c140 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
2c150 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64  s.    ** being d
2c160 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
2c170 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
2c180 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2c190 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
2c1a0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
2c1b0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
2c1c0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
2c1d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
2c1e0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
2c1f0 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
2c200 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
2c210 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a   than the .    *
2c220 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * current value 
2c230 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
2c240 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b   set dbSize back
2c250 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20   to the value.  
2c260 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
2c270 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
2c280 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2c290 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
2c2a0 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  e.    ** calls t
2c2b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2c2c0 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
2c2d0 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
2c2e0 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  of .    ** readi
2c2f0 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
2c300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2c310 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68      **.    ** Wh
2c320 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  en journal_mode=
2c330 3d 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53  =OFF the dbOrigS
2c340 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65  ize is always ze
2c350 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20  ro, so this.    
2c360 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72  ** block never r
2c370 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  uns if journal_m
2c380 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a  ode=OFF..    */.
2c390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c3a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2c3b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2c3c0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
2c3d0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 26  OrigSize .     &
2c3e0 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  & ALWAYS(pPager-
2c3f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2c400 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c410 4f 46 46 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF).    ){.    
2c420 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20    Pgno i;       
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c450 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2c460 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2c470 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
2c480 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2c490 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c  r); /* Pending l
2c4a0 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ock page */.    
2c4b0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53    const Pgno dbS
2c4c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2c4d0 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44  Size;       /* D
2c4e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69  atabase image si
2c4f0 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61  ze */ .      pPa
2c500 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
2c510 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2c520 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64  ;.      for( i=d
2c530 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
2c540 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
2c550 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i++ ){.        i
2c560 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
2c570 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2c580 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
2c590 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
2c5a0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2c5b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2c5c0 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e  /* Page to journ
2c5d0 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  al */.          
2c5e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c5f0 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
2c600 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2c610 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c620 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2c630 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2c640 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  t;.          rc 
2c650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c660 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
2c670 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2c680 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2c690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c6a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c6b0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2c6c0 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2c6d0 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20    }.      } .   
2c6e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2c6f0 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
2c700 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2c710 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
2c720 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
2c730 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2c740 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65  file. If a maste
2c750 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  r .    ** journa
2c760 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
2c770 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2c780 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2c790 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a  nal file, .    *
2c7a0 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20  * or if zMaster 
2c7b0 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74  is NULL (no mast
2c7c0 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65  er journal), the
2c7d0 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
2c7e0 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
2c7f0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
2c800 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
2c810 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
2c820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c830 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c840 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c850 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
2c860 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2c870 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
2c880 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
2c890 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a  n is being.    *
2c8a0 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c  * used, this cal
2c8b0 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74  l will not creat
2c8c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2c8d0 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e  le or perform an
2c8e0 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f  y.    ** real IO
2c8f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2c900 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2c910 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
2c920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c930 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c940 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20  _one_exit;..    
2c950 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
2c960 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
2c970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2c980 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
2c990 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2c9a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2c9b0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2c9c0 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66  PCache));.    if
2c9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c9e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c9f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
2ca00 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
2ca10 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70     goto commit_p
2ca20 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2ca30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ca40 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
2ca50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2ca60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2ca70 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
2ca80 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
2ca90 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
2caa0 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20  e image,.    ** 
2cab0 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74  then use pager_t
2cac0 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20  runcate to grow 
2cad0 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69  or shrink the fi
2cae0 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  le here..    */.
2caf0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2cb00 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
2cb10 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2cb20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20      Pgno nNew = 
2cb30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d  pPager->dbSize -
2cb40 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
2cb50 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
2cb60 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
2cb70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cb80 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2cb90 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
2cba0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
2cbb0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
2cbc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2cbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cbe0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2cbf0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  ne_exit;.    }..
2cc00 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
2cc10 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2cc20 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2cc30 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2cc40 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
2cc50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2cc60 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2cc70 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2cc80 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
2cc90 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
2cca0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
2ccb0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
2ccc0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2ccd0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f  _SYNCED;.  }..co
2cce0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2ccf0 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
2cd00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ;.}.../*.** When
2cd10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2cd20 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61  s called, the da
2cd30 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
2cd40 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  been completely.
2cd50 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  ** updated to re
2cd60 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65  flect the change
2cd70 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75  s made by the cu
2cd80 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2cd90 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20  n and.** synced 
2cda0 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75  to disk. The jou
2cdb0 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20  rnal file still 
2cdc0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2cdd0 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68  le-system .** th
2cde0 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66  ough, and if a f
2cdf0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74  ailure occurs at
2ce00 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
2ce10 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a  ill eventually.*
2ce20 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68  * be used as a h
2ce30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  ot-journal and t
2ce40 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2ce50 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61  action rolled ba
2ce60 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
2ce70 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65  unction finalize
2ce80 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
2ce90 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65  le, either by de
2cea0 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e  leting, .** trun
2ceb0 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61  cating or partia
2cec0 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20  lly zeroing it, 
2ced0 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f  so that it canno
2cee0 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  t be used .** fo
2cef0 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  r hot-journal ro
2cf00 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69  llback. Once thi
2cf10 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72  s is done the tr
2cf20 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
2cf30 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d  irrevocably comm
2cf40 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
2cf50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2cf60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2cf70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2cf80 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d  d the pager.** m
2cf90 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72  oves into the er
2cfa0 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ror state. Other
2cfb0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
2cfc0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2cfd0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2cfe0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
2cff0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2d000 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d010 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2d020 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d030 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2d040 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2d050 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
2d060 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  if a prior error
2d070 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20   has occurred.. 
2d080 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20   ** But if (due 
2d090 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2d0a0 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74  r elsewhere in t
2d0b0 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f  he system) it do
2d0c0 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c  es get.  ** call
2d0d0 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  ed, just return 
2d0e0 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
2d0f0 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  ode without doin
2d100 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20  g anything. */. 
2d110 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2d120 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2d130 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2d140 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Code;..  /* This
2d150 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
2d160 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
2d170 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
2d180 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20  ot in at least. 
2d190 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
2d1a0 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e  ED state. And in
2d1b0 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65  deed SQLite neve
2d1c0 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74  r does this. But
2d1d0 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65   it is.  ** nice
2d1e0 20 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65   to have this de
2d1f0 66 65 6e 73 69 76 65 20 74 65 73 74 20 68 65 72  fensive test her
2d200 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  e anyway..  */. 
2d210 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2d220 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
2d230 45 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72  ESERVED) ) retur
2d240 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2d250 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a  .  /* An optimiz
2d260 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61  ation. If the da
2d270 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61  tabase was not a
2d280 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64  ctually modified
2d290 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69   during.  ** thi
2d2a0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  s transaction, t
2d2b0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2d2c0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2d2d0 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a  -mode and is.  *
2d2e0 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65  * using persiste
2d2f0 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  nt journals, the
2d300 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2d310 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
2d320 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20  .  ** The start 
2d330 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2d340 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
2d350 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
2d360 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
2d370 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52  ader with the nR
2d380 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20  ec field set to 
2d390 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75  0. If such a jou
2d3a0 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a  rnal is used as.
2d3b0 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
2d3c0 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  al during hot-jo
2d3d0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
2d3e0 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  0 changes will b
2d3f0 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74  e made.  ** to t
2d400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d410 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  . So there is no
2d420 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68   need to zero th
2d430 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2d440 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68  header. Since th
2d450 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
2d460 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
2d470 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
2d480 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20   ** to drop any 
2d490 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20  locks either..  
2d4a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
2d4b0 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
2d4c0 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  & pPager->exclus
2d4d0 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70  iveMode .   && p
2d4e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2d4f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2d500 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
2d510 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2d520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d530 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
2d540 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
2d550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d560 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  K;.  }..  PAGERT
2d570 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64  RACE(("COMMIT %d
2d580 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2d590 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74  ger)));.  assert
2d5a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2d5b0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
2d5c0 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65   MEMDB || !pPage
2d5d0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
2d5e0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
2d5f0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2d600 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2d610 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  tMaster);.  retu
2d620 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2d630 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
2d640 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
2d650 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64  l changes. The d
2d660 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
2d670 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
2d680 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ED mode..**.** T
2d690 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
2d6a0 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a  forms two tasks:
2d6b0 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72  .**.**   1) It r
2d6c0 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f  olls back the jo
2d6d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74  urnal file, rest
2d6e0 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61  oring all databa
2d6f0 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  se file and .** 
2d700 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63       in-memory c
2d710 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68  ache pages to th
2d720 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72  e state they wer
2d730 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72  e in when the tr
2d740 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  ansaction.**    
2d750 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e    was opened, an
2d760 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e  d.**   2) It fin
2d770 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2d780 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74  al file, so that
2d790 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   it is not used 
2d7a0 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20  for hot.**      
2d7b0 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20  rollback at any 
2d7c0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
2d7d0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65  ure..**.** subje
2d7e0 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
2d7f0 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f  ing qualificatio
2d800 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74  ns:.**.** * If t
2d810 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d820 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20  is not yet open 
2d830 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2d840 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  on is called,.**
2d850 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29     then only (2)
2d860 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49   is performed. I
2d870 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2d880 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20  e is no journal 
2d890 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c  file.**   to rol
2d8a0 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20  l back..**.** * 
2d8b0 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  If in an error s
2d8c0 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
2d8d0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65  SQLITE_FULL, the
2d8e0 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a  n task (1) is .*
2d8f0 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49  *   performed. I
2d900 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61  f successful, ta
2d910 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65  sk (2). Regardle
2d920 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d  ss of the outcom
2d930 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72  e.**   of either
2d940 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  , the error stat
2d950 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2d960 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
2d970 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65  caller.**   (i.e
2d980 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  . either SQLITE_
2d990 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f  IOERR or SQLITE_
2d9a0 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
2d9b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
2d9c0 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52  s in PAGER_RESER
2d9d0 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
2d9e0 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65  attempt (1). Whe
2d9f0 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74  ther.**   or not
2da00 20 28 31 29 20 69 73 20 73 75 63 63 75 73 73 66   (1) is succussf
2da10 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74  ul, also attempt
2da20 20 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73   (2). If success
2da30 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20  ful, return.**  
2da40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
2da50 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65  rwise, enter the
2da60 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
2da70 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   return the firs
2da80 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f  t .**   error co
2da90 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20  de encountered. 
2daa0 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73  .**.**   In this
2dab0 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
2dac0 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
2dad0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77  e database was w
2dae0 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20  ritten to. .**  
2daf0 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66   So is safe to f
2db00 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
2db10 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66  nal file even if
2db20 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a   the playback .*
2db30 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31  *   (operation 1
2db40 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65  ) failed. Howeve
2db50 72 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74  r the pager must
2db60 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
2db70 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74   state.**   as t
2db80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2db90 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
2dba0 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65  he are now suspe
2dbb0 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61  ct..**.** * Fina
2dbc0 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52  lly, if in PAGER
2dbd0 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65  _EXCLUSIVE state
2dbe0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2dbf0 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74  1). Only.**   at
2dc00 74 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29  tempt (2) if (1)
2dc10 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
2dc20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2dc30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   if successful,.
2dc40 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65  **   otherwise e
2dc50 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2dc60 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
2dc70 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66  the error code f
2dc80 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61  rom the .**   fa
2dc90 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  iling operation.
2dca0 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73  .**.**   In this
2dcb0 20 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61   case the databa
2dcc0 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65  se file may have
2dcd0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2dce0 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20  . So if the.**  
2dcf0 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
2dd00 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63  ion did not succ
2dd10 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  eed it would not
2dd20 20 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61   be safe to fina
2dd30 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f  lize.**   the jo
2dd40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e  urnal file. It n
2dd50 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20  eeds to be left 
2dd60 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
2dd70 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20  em so that.**   
2dd80 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
2dd90 73 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f  ss can use it to
2dda0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2ddb0 61 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a  abase state (by.
2ddc0 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  **   hot-journal
2ddd0 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69   rollback)..*/.i
2dde0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
2ddf0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
2de00 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2de10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2de30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2de40 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2de50 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
2de60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2de70 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2de80 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20  ->dbModified || 
2de90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2dea0 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  jfd) ){.    rc =
2deb0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2dec0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
2ded0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
2dee0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2def0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
2df00 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
2df10 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
2df20 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2df30 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
2df40 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
2df50 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
2df60 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2df70 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67   }.    rc = pPag
2df80 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2df90 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
2dfa0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2dfb0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
2dfc0 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20       int rc2;.  
2dfd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2dfe0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2dff0 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20  0);.      rc2 = 
2e000 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2e010 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2e020 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2e030 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2e040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e050 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
2e060 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e070 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2e080 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e090 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  er, 0);.    }.. 
2e0a0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
2e0b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
2e0c0 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
2e0d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2e0e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2e0f0 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
2e100 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
2e110 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
2e120 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  ager.    ** cach
2e130 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72  e. So call pager
2e140 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20  _error() on the 
2e150 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20  way out to make 
2e160 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a  any error .    *
2e170 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
2e180 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
2e190 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2e1a0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rc);.  }.  ret
2e1b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e1c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2e1d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e1e0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
2e1f0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
2e200 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
2e210 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
2e220 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
2e230 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61  .*/.u8 sqlite3Pa
2e240 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61  gerIsreadonly(Pa
2e250 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2e260 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
2e270 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
2e280 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2e290 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2e2a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a  s to the pager..
2e2b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e2c0 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65  gerRefcount(Page
2e2d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2e2e0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
2e2f0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2e300 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
2e310 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e320 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2e330 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65  ences to the spe
2e340 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
2e350 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e360 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50  PageRefcount(DbP
2e370 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
2e380 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
2e390 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
2e3a0 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65  pPage);.}..#ifde
2e3b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
2e3c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e3d0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
2e3e0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
2e3f0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
2e400 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
2e410 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
2e420 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
2e430 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73  [11];.  a[0] = s
2e440 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2e450 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e460 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20  ache);.  a[1] = 
2e470 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
2e480 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
2e490 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20  PCache);.  a[2] 
2e4a0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47  = sqlite3PcacheG
2e4b0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
2e4c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e4d0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
2e4e0 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e  bSizeValid ? (in
2e4f0 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t) pPager->dbSiz
2e500 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d  e : -1;.  a[4] =
2e510 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
2e520 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
2e530 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
2e540 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
2e550 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
2e560 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
2e570 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
2e580 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
2e590 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
2e5a0 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
2e5b0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
2e5c0 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
2e5d0 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
2e5e0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2e5f0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
2e600 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f  memory pager..*/
2e610 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e620 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a  rIsMemdb(Pager *
2e630 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2e640 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a  n MEMDB;.}../*.*
2e650 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2e660 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  re are at least 
2e670 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70  nSavepoint savep
2e680 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74  oints open. If t
2e690 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72  here are.** curr
2e6a0 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  ently less than 
2e6b0 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e  nSavepoints open
2e6c0 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20  , then open one 
2e6d0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
2e6e0 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70  ts.** to make up
2e6f0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e   the difference.
2e700 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
2e710 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20  f savepoints is 
2e720 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c  already.** equal
2e730 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20   to nSavepoint, 
2e740 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2e750 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2e760 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
2e770 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2e780 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
2e790 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2e7a0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
2e7b0 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
2e7c0 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  g the sub-journa
2e7d0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20  l file, then an 
2e7e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2e7f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
2e800 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2e810 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
2e820 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
2e830 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
2e840 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  er, int nSavepoi
2e850 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2e860 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e880 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2e890 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  */.  int nCurren
2e8a0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  t = pPager->nSav
2e8b0 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
2e8c0 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
2e8d0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a   of savepoints *
2e8e0 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f  /..  if( nSavepo
2e8f0 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20  int>nCurrent && 
2e900 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e910 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  al ){.    int ii
2e920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e940 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2e950 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61  riable */.    Pa
2e960 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
2e970 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2e980 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67        /* New Pag
2e990 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
2e9a0 72 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45  ray */..    /* E
2e9b0 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 6e  ither there is n
2e9c0 6f 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c  o active journal
2e9d0 20 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   or the sub-jour
2e9e0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a  nal is open or .
2e9f0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2ea00 61 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  al is always sto
2ea10 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f  red in memory */
2ea20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ea30 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
2ea40 3d 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  =0 || isOpen(pPa
2ea50 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20  ger->sjfd) ||.  
2ea60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2ea70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2ea80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ea90 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20  _MEMORY );..    
2eaa0 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
2eab0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2eac0 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
2ead0 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
2eae0 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
2eaf0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
2eb00 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
2eb10 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
2eb20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
2eb30 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
2eb40 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
2eb50 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
2eb60 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
2eb70 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
2eb80 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20      */.    aNew 
2eb90 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
2eba0 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
2ebb0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
2ebc0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
2ebd0 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
2ebe0 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
2ebf0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
2ec00 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
2ec10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ec20 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
2ec30 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72  emset(&aNew[nCur
2ec40 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65  rent], 0, (nSave
2ec50 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20  point-nCurrent) 
2ec60 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
2ec70 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70  vepoint));.    p
2ec80 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2ec90 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50  t = aNew;.    pP
2eca0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2ecb0 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a   = nSavepoint;..
2ecc0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
2ecd0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
2ece0 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
2ecf0 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
2ed00 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
2ed10 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
2ed20 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2ed30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ed40 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
2ed50 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2ed60 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e  nOrig = pPager->
2ed70 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  dbSize;.      if
2ed80 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2ed90 3e 6a 66 64 29 20 26 26 20 41 4c 57 41 59 53 28  >jfd) && ALWAYS(
2eda0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2edb0 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ff>0) ){.       
2edc0 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2edd0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
2ede0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65  nalOff;.      }e
2edf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65  lse{.        aNe
2ee00 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20  w[ii].iOffset = 
2ee10 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
2ee20 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
2ee30 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
2ee40 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d  SubRec = pPager-
2ee50 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20  >nSubRec;.      
2ee60 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
2ee70 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  point = sqlite3B
2ee80 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
2ee90 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
2eea0 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
2eeb0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
2eec0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2eed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2eee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2eef0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2ef00 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2ef10 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2ef20 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63  pened. */.    rc
2ef30 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2ef40 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  l(pPager);.    a
2ef50 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
2ef60 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
2ef70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2ef80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2ef90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2efa0 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
2efb0 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  or release (comm
2efc0 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  it) a savepoint.
2efd0 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2efe0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20  t to release or 
2eff0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f  rollback need no
2f000 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65  t be the most re
2f010 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74  cently .** creat
2f020 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ed savepoint..**
2f030 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
2f040 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
2f050 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
2f060 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
2f070 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
2f080 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
2f090 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
2f0a0 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
2f0b0 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
2f0c0 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
2f0d0 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
2f0e0 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
2f0f0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
2f100 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
2f110 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
2f120 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
2f130 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2f140 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
2f150 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76  d..**.** The sav
2f160 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61  epoint to rollba
2f170 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73  ck or release is
2f180 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2f190 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61  arameter .** iSa
2f1a0 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65  vepoint. A value
2f1b0 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f   of 0 means to o
2f1c0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75  perate on the ou
2f1d0 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2f1e0 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20  t.** (the first 
2f1f0 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75  created). A valu
2f200 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76  e of (Pager.nSav
2f210 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20  epoint-1) means 
2f220 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68  operate.** on th
2f230 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2f240 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
2f250 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74  t. If iSavepoint
2f260 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2f270 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65  .** (Pager.nSave
2f280 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74  point-1), then t
2f290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f2a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2f2b0 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
2f2c0 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ue is passed to 
2f2d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
2f2e0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2f2f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2f300 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  s rolled back. T
2f310 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
2f320 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   to calling .** 
2f330 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
2f340 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74  back() because t
2f350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2f360 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a  s not terminate.
2f370 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
2f380 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  on or unlock the
2f390 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75   database, it ju
2f3a0 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20  st restores the 
2f3b0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2f3c0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2f3d0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
2f3e0 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  te. .**.** In an
2f3f0 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65  y case, all save
2f400 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69  points with an i
2f410 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
2f420 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  n iSavepoint .**
2f430 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20   are destroyed. 
2f440 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
2f450 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  ease operation (
2f460 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f470 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20  LEASE),.** then 
2f480 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
2f490 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73  oint is also des
2f4a0 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  troyed..**.** Th
2f4b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2f4c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f4d0 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
2f4e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2f4f0 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72  ,.** or an IO er
2f500 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49  ror code if an I
2f510 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f520 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
2f530 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  k a .** savepoin
2f540 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  t. If no errors 
2f550 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
2f560 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2f570 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67   .int sqlite3Pag
2f580 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  erSavepoint(Page
2f590 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f  r *pPager, int o
2f5a0 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
2f5b0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2f5c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2f5d0 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
2f5e0 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
2f5f0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f600 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
2f610 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
2f620 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
2f630 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
2f640 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
2f650 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2f660 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
2f670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f680 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2f690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   */.    int nNew
2f6a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2f6b0 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e  mber of remainin
2f6c0 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74  g savepoints aft
2f6d0 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a  er this op. */..
2f6e0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
2f6f0 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70  t how many savep
2f700 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c  oints will still
2f710 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
2f720 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65   this.    ** ope
2f730 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68  ration. Store th
2f740 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77  is value in nNew
2f750 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f  . Then free reso
2f760 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  urces associated
2f770 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e   .    ** with an
2f780 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
2f790 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  t are destroyed 
2f7a0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
2f7b0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  n..    */.    nN
2f7c0 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
2f7d0 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  + (( op==SAVEPOI
2f7e0 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30  NT_RELEASE ) ? 0
2f7f0 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 1);.    for(i
2f800 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
2f810 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
2f820 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
2f830 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
2f840 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
2f850 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
2f860 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
2f870 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2f880 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
2f890 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2f8a0 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20   release of the 
2f8b0 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
2f8c0 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20  int, truncate . 
2f8d0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
2f8e0 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79  urnal to zero by
2f8f0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
2f900 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
2f910 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b  POINT_RELEASE ){
2f920 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  .      if( nNew=
2f930 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  =0 && isOpen(pPa
2f940 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2f950 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72        /* Only tr
2f960 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73 20  uncate if it is 
2f970 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62  an in-memory sub
2f980 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20  -journal. */.   
2f990 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2f9a0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
2f9b0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2f9c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f9d0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
2f9e0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
2f9f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fa00 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2fa10 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ec = 0;.      }.
2fa20 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c 73      }.    /* Els
2fa30 65 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  e this is a roll
2fa40 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20  back operation, 
2fa50 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65  playback the spe
2fa60 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
2fa70 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
2fa80 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c   is a temp-file,
2fa90 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2faa0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2fab0 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a   file has.    **
2fac0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2fad0 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
2fae0 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65  se there have be
2faf0 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
2fb00 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
2fb10 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68  base file, so th
2fb20 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61  e playback opera
2fb30 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70  tion can be skip
2fb40 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ped..    */.    
2fb50 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
2fb60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2fb70 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
2fb80 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
2fb90 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
2fba0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2fbb0 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
2fbc0 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
2fbd0 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
2fbe0 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
2fbf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2fc00 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
2fc10 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a 20  ;.    }.  .  }. 
2fc20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fc30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2fc40 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
2fc50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fc60 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2fc70 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
2fc80 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
2fc90 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2fca0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2fcb0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
2fcc0 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
2fcd0 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
2fce0 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
2fcf0 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
2fd00 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
2fd10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2fd20 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
2fd30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2fd40 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
2fd50 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
2fd60 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
2fd70 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
2fd80 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
2fd90 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
2fda0 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
2fdb0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2fdc0 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
2fdd0 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
2fde0 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
2fdf0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2fe00 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
2fe10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2fe20 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
2fe30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2fe40 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2fe50 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
2fe60 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
2fe70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2fe80 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
2fe90 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
2fea0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
2feb0 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
2fec0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
2fed0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
2fee0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
2fef0 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
2ff00 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
2ff10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ff20 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
2ff30 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2ff40 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
2ff50 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2ff60 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
2ff70 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76 65   Set or retrieve
2ff80 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
2ff90 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61  his pager.*/.sta
2ffa0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2ffb0 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
2ffc0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
2ffd0 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
2ffe0 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
2fff0 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
30000 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
30010 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
30020 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
30030 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20  cFree)(void*),. 
30040 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b   void *pCodec.){
30050 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
30060 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
30070 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
30080 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
30090 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
300a0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62   = pPager->memDb
300b0 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a 20   ? 0 : xCodec;. 
300c0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
300d0 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65 63  izeChng = xCodec
300e0 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61 67  SizeChng;.  pPag
300f0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 3d  er->xCodecFree =
30100 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20 70   xCodecFree;.  p
30110 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d 20  Pager->pCodec = 
30120 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72 52  pCodec;.  pagerR
30130 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
30140 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
30150 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
30160 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70 50  tCodec(Pager *pP
30170 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
30180 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a  pPager->pCodec;.
30190 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
301a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
301b0 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
301c0 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67  ove the page pPg
301d0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
301e0 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  o in the file..*
301f0 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
30200 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
30210 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65   to the page pre
30220 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20  viously located 
30230 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63  at.** pgno (whic
30240 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64  h we call pPgOld
30250 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61  ) though that pa
30260 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  ge is allowed to
30270 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e   be.** in cache.
30280 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72    If the page pr
30290 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
302a0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
302b0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
302c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
302d0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
302e0 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
302f0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
30300 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
30310 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
30320 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
30330 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
30340 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
30350 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
30360 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
30370 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
30380 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
30390 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
303a0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
303b0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
303c0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
303d0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
303e0 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
303f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
30400 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
30410 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
30420 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
30430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
30440 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
30450 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
30460 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
30470 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
30480 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
30490 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
304a0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
304b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
304c0 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ve)..**.** If th
304d0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
304e0 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20  t, isCommit, is 
304f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
30500 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69 6e  his page is bein
30510 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61  g.** moved as pa
30520 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  rt of a database
30530 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20   reorganization 
30540 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  just before the 
30550 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
30560 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
30570 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
30580 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
30590 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ed that the data
305a0 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50  base page .** pP
305b0 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c  g refers to will
305c0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
305d0 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  to again within 
305e0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
305f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
30600 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
30610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
30620 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
30630 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  e if an error.**
30640 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77 69   occurs. Otherwi
30650 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 53  se, it returns S
30660 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
30670 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
30680 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
30690 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
306a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74  , Pgno pgno, int
306b0 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67   isCommit){.  Pg
306c0 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20  Hdr *pPgOld;    
306d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
306e0 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
306f0 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50  rwritten. */.  P
30700 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
30710 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
30720 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d  ld value of pPg-
30730 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69  >pgno, if sync i
30740 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
30750 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30770 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
30780 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20   Pgno origPgno; 
30790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307a0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   The original pa
307b0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20  ge number */..  
307c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
307d0 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  f>0 );..  /* In 
307e0 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c 65  order to be able
307f0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e   to rollback, an
30800 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
30810 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61 6c  ase must journal
30820 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
30830 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72 6f  e are moving fro
30840 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  m..  */.  if( ME
30850 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MDB ){.    rc = 
30860 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30870 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  e(pPg);.    if( 
30880 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30890 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
308a0 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65   page being move
308b0 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68  d is dirty and h
308c0 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65  as not been save
308d0 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a  d by the latest.
308e0 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20    ** savepoint, 
308f0 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75  then save the cu
30900 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
30910 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  f the page into 
30920 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
30930 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20  urnal now. This 
30940 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  is required to h
30950 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77  andle the follow
30960 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20  ing scenario:.  
30970 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
30980 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
30990 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20  al page X, then 
309a0 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d  modify it in mem
309b0 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41  ory>.  **     SA
309c0 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a  VEPOINT one;.  *
309d0 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61  *       <Move pa
309e0 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  ge X to location
309f0 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c   Y>.  **     ROL
30a00 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
30a10 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20  **.  ** If page 
30a20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74  X were not writt
30a30 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
30a40 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77  urnal here, it w
30a50 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
30a60 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73   possible to res
30a70 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  tore its content
30a80 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  s when the "ROLL
30a90 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a  BACK TO one".  *
30aa0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65  * statement were
30ab0 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20   is processed.. 
30ac0 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72   **.  ** subjour
30ad0 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65  nalPage() may ne
30ae0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
30af0 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50  pace to store pP
30b00 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a  g->pgno into.  *
30b10 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  * one or more sa
30b20 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e  vepoint bitvecs.
30b30 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61   This is the rea
30b40 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  son this functio
30b50 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72  n.  ** may retur
30b60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
30b70 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
30b80 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
30b90 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75  Y.   && subjRequ
30ba0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
30bb0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
30bc0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
30bd0 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20  age(pPg)).  ){. 
30be0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30bf0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
30c00 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
30c10 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
30c20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
30c30 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
30c40 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
30c50 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  o, (pPg->flags&P
30c60 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
30c70 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49  1:0, pgno));.  I
30c80 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
30c90 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
30ca0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
30cb0 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68  no))..  /* If th
30cc0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
30cd0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
30ce0 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
30cf0 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
30d00 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
30d10 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
30d20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
30d30 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
30d40 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
30d50 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
30d60 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
30d70 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
30d80 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
30d90 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
30da0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
30db0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
30dc0 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
30dd0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
30de0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
30df0 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
30e00 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
30e10 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
30e20 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
30e30 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
30e40 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
30e50 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
30e60 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
30e70 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
30e80 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
30e90 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
30ea0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
30eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
30ec0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
30ed0 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
30ee0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
30ef0 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
30f00 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
30f10 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
30f20 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
30f30 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
30f40 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
30f50 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
30f60 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
30f70 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
30f80 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
30f90 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
30fa0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
30fb0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
30fc0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
30fd0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
30fe0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
30ff0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
31000 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
31010 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
31020 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
31030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
31040 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
31050 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
31060 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
31070 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
31080 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
31090 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
310a0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
310b0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64       /* Do not d
310c0 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72 6f  iscard pages fro
310d0 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  m an in-memory d
310e0 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77 65  atabase since we
310f0 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20   might.      ** 
31100 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
31110 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d 6f   later.  Just mo
31120 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  ve the page out 
31130 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a 20  of the way. */. 
31140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
31150 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
31160 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
31170 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f  3PcacheMove(pPgO
31180 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ld, pPager->dbSi
31190 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ze+1);.    }else
311a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
311b0 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
311c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
311d0 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  origPgno = pPg->
311e0 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50  pgno;.  sqlite3P
311f0 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70  cacheMove(pPg, p
31200 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  gno);.  sqlite3P
31210 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
31220 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
31230 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
31240 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
31250 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
31260 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
31270 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
31280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31290 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
312a0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
312b0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
312c0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
312d0 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
312e0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
312f0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
31300 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
31310 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
31320 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
31330 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
31340 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
31350 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
31360 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
31370 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
31380 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
31390 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
313a0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
313b0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
313c0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
313d0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
313e0 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
313f0 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
31400 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
31410 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
31420 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
31430 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
31440 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
31450 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
31460 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
31470 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
31480 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
31490 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
314a0 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
314b0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
314c0 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
314d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
314e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
314f0 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
31500 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
31510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
31520 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
31530 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
31540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31550 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
31560 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
31570 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
31580 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
31590 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
315a0 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
315b0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
315c0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
315d0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
315e0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
315f0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50  oo..    */.    P
31600 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
31610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31620 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
31630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31640 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
31650 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
31660 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
31670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31680 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 79        if( needSy
31690 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
316a0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
316b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
316c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21  ager->pTmpSpace!
316d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
316e0 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
316f0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
31700 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
31710 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  o, pPager->pTmpS
31720 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pace);.      }. 
31730 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31740 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
31750 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
31760 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31770 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
31780 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
31790 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  PgHdr->flags |= 
317a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
317b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
317c0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48  heMakeDirty(pPgH
317d0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
317e0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
317f0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  r);.  }..  /*.  
31800 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
31810 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61  ory database, ma
31820 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69 67  ke sure the orig
31830 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e  inal page contin
31840 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73  ues.  ** to exis
31850 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  t, in case the t
31860 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
31870 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
31880 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a 20  Use pPgOld.  ** 
31890 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
318a0 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68 61  page since it ha
318b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
318c0 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a 20  llocated..  */. 
318d0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
318e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
318f0 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69 67  ove(pPgOld, orig
31900 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Pgno);.    sqlit
31910 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
31920 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Old);.  }..  ret
31930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31940 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
31950 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31960 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
31970 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
31980 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
31990 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
319a0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
319b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
319c0 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
319d0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
319e0 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
319f0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
31a00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
31a10 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
31a20 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
31a30 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
31a40 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
31a50 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
31a60 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
31a70 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
31a80 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
31a90 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
31aa0 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Extra;.}../*.** 
31ab0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
31ac0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
31ad0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
31ae0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
31af0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
31b00 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
31b10 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
31b20 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
31b30 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
31b40 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
31b50 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
31b60 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
31b70 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
31b80 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
31b90 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
31ba0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
31bb0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
31bc0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
31bd0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
31be0 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
31bf0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
31c00 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
31c10 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
31c20 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
31c30 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
31c40 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
31c50 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
31c60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
31c70 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
31c80 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
31c90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31ca0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
31cb0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
31cc0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
31cd0 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
31ce0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
31cf0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
31d00 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
31d10 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
31d20 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
31d30 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
31d40 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
31d50 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
31d60 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
31d70 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
31d80 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
31d90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
31da0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
31db0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
31dc0 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
31dd0 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
31de0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
31df0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
31e00 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
31e10 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
31e20 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
31e30 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
31e40 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
31e50 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31e60 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
31e70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
31e80 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
31e90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
31ea0 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
31eb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
31ec0 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
31ed0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31ee0 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
31ef0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
31f00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
31f10 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
31f20 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20  QUERY, then the 
31f30 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20  journal_mode is 
31f40 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61  set to the.** va
31f50 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66  lue specified if
31f60 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
31f70 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68 61  llowed.  The cha
31f80 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  nge is disallowe
31f90 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c  d.** for the fol
31fa0 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
31fb0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
31fc0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
31fd0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
31fe0 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
31ff0 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
32000 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
32010 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a  **.**   *  The j
32020 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20  ournal mode may 
32030 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77  not be changed w
32040 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69  hile a transacti
32050 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
32060 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
32070 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
32080 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
32090 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
320a0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
320b0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
320c0 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
320d0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
320e0 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
320f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32100 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
32110 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32120 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32130 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
32140 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32150 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32160 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
32170 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32180 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32190 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
321a0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
321b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
321c0 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
321d0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
321e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
321f0 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72  EMORY );.  asser
32200 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
32210 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
32220 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20    if( eMode>=0. 
32230 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20    && (!MEMDB || 
32240 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
32250 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
32260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
32270 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32280 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a  OURNALMODE_OFF).
32290 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64     && !pPager->d
322a0 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20  bModified.   && 
322b0 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
322c0 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67  >jfd) || 0==pPag
322d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a  er->journalOff).
322e0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f    ){.    if( isO
322f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32300 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32310 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
32320 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >jfd);.    }.   
32330 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32340 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
32350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
32360 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
32370 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
32380 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
32390 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
323a0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
323b0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
323c0 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
323d0 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
323e0 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
323f0 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
32400 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
32410 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
32420 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
32430 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
32440 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
32450 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
32460 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
32470 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
32480 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
32490 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
324a0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
324b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
324c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
324d0 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
324e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
324f0 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
32500 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
32510 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
32520 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
32530 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
32540 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
32550 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
32560 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
32570 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
32580 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
32590 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
325a0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
325b0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
325c0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
325d0 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
325e0 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
325f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32600 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
32610 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65  ->pBackup;.}..#e
32620 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32630 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.