/ Hex Artifact Content
Login

Artifact e31b8fc35cd1a07edcb5770aaac77b81b8659c99:


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 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
9140: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
9150: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
9160: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
9170: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
9180: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9190: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
91b0: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
91c0: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
91d0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
91e0: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
91f0: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9200: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9210: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9220: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9230: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
9240: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
9250: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
9260: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
9270: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
9280: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
9290: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
92a0: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
92b0: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
92c0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
92d0: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
92e0: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
92f0: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9300: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9310: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9320: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9330: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
9340: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
9350: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
9360: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
9370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9390: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
93a0: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
93b0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
93c0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
93d0: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
93e0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
93f0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9400: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9410: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9420: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9430: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
9440: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
9450: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
9460: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
9470: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9480: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
9490: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
94a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
94b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
94c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
94d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
94e0: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
94f0: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
9500: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
9510: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
9520: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
9530: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
9540: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
9550: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
9560: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
9570: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
9580: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
9590: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
95a0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
95b0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
95c0: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
95d0: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
95e0: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
95f0: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
9600: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
9610: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
9620: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
9630: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
9640: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
9650: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
9660: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
9670: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
9680: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9690: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
96a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
96b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
96c0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
96d0: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
96e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
96f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9700: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
9710: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
9720: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
9730: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9740: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
9750: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
9760: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
9770: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
9780: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
9790: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
97a0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
97b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
97c0: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
97d0: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
97e0: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
97f0: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
9800: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
9810: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
9820: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
9830: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
9840: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
9850: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
9860: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
9870: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
9880: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
9890: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
98a0: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
98b0: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
98c0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
98d0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
98e0: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
98f0: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
9900: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
9910: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9920: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
9930: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
9940: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
9950: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
9960: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
9970: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
9980: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
9990: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
99a0: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
99b0: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
99c0: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
99d0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
99e0: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
99f0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
9a00: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9a10: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
9a20: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
9a30: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
9a40: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
9a50: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9a80: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9ab0: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
9ac0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
9ad0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9ae0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9af0: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
9b00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9b10: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
9b40: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
9b50: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
9b60: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9b70: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
9b80: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
9b90: 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ster */..  if( !
9ba0: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
9bb0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20  r->setMaster.   
9bc0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
9bd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9be0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9bf0: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
9c00: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c10: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c20: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9c40: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
9c50: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
9c60: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9c70: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
9c80: 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
9c90: 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
9ca0: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
9cb0: 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
9cc0: 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
9cd0: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9ce0: 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
9cf0: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
9d00: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
9d10: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
9d20: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
9d30: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9d40: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
9d50: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
9d60: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
9d70: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
9d80: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
9d90: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
9da0: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
9db0: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
9dc0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9dd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
9de0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
9df0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
9e00: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
9e10: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
9e20: 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
9e30: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
9e40: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
9e50: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
9e60: 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
9e70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9e80: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
9e90: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
9ea0: 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
9eb0: 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
9ec0: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
9ed0: 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
9ee0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
9ef0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f00: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
9f10: 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
9f20: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
9f30: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9f40: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
9f50: 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
9f60: 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
9f70: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9f80: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9f90: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
9fa0: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
9fb0: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
9fc0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
9fd0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9fe0: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
9ff0: 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
a000: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
a010: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a020: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
a030: 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
a040: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
a050: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a060: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
a070: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a080: 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
a090: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
a0a0: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
a0b0: 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Sync;..  /* If t
a0c0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
a0d0: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
a0e0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
a0f0: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
a100: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
a110: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
a120: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
a130: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
a140: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
a150: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
a160: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
a170: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
a180: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
a190: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
a1a0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
a1b0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
a1c0: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
a1d0: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
a1e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
a1f0: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
a200: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
a210: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
a220: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
a230: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
a240: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
a250: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
a260: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
a270: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
a280: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
a290: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
a2a0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
a2b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
a2c0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
a2d0: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
a2e0: 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
a2f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a300: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
a310: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a320: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
a330: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a340: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
a350: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
a360: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
a370: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
a380: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
a390: 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
a3a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
a3b0: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
a3c0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
a3d0: 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
a3e0: 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
a3f0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
a400: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
a410: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a420: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
a430: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
a440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a450: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
a460: 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
a470: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
a480: 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
a490: 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
a4a0: 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
a4b0: 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
a4c0: 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
a4d0: 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
a4e0: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
a4f0: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
a500: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
a510: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
a520: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
a530: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
a540: 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
a550: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a560: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 61  state, discard a
a570: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
a580: 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61  es. If.** the pa
a590: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a5a0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
a5b0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
a5c0: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68  ..**.** TODO: Wh
a5d0: 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73  y can we not res
a5e0: 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68 69  et the pager whi
a5f0: 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  le in error stat
a600: 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e?.*/.static voi
a610: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
a620: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a630: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70  if( SQLITE_OK==p
a640: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
a650: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  {.    sqlite3Bac
a660: 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
a670: 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  r->pBackup);.   
a680: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
a690: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
a6a0: 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  che);.    pPager
a6b0: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
a6c0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
a6d0: 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
a6e0: 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
a6f0: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
a700: 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
a710: 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
a720: 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
a730: 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
a740: 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
a750: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
a760: 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
a770: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
a780: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
a790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a7a0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
a7b0: 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
a7c0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7e0: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
a7f0: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
a800: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
a810: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
a820: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
a830: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
a840: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
a850: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
a860: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
a870: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
a880: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
a890: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
a8a0: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
a8b0: 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
a8c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a8d0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
a8e0: 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
a8f0: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
a900: 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
a910: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
a920: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
a930: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
a940: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
a950: 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
a960: 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
a970: 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
a980: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
a990: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
a9a0: 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
a9b0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
a9c0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
a9d0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
a9e0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
a9f0: 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
aa00: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
aa10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
aa20: 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
aa30: 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
aa40: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
aa50: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
aa60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aa70: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
aa80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aa90: 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
aaa0: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
aab0: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
aac0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
aad0: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
aae0: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
aaf0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ab00: 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
ab10: 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
ab20: 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
ab30: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
ab40: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
ab50: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
ab60: 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
ab70: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
ab80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
ab90: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
aba0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
abb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
abc0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
abd0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
abe0: 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
abf0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
ac00: 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  if the pager.** 
ac10: 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
ac20: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mode..**.** If t
ac30: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
ac40: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
ac50: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
ac60: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
ac70: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
ac80: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
ac90: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
aca0: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
acb0: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
acc0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
acd0: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
ace0: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
acf0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
ad00: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
ad10: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
ad20: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
ad30: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
ad40: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
ad50: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
ad60: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
ad70: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
ad80: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
ad90: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
ada0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
adb0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ade0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  code */..    /* 
adf0: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
ae00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
ae10: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
ae20: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
ae30: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
ae40: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
ae50: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
ae60: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
ae70: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
ae80: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
ae90: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
aea0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
aeb0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
aec0: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
aed0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
aee0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
aef0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
af00: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
af10: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
af20: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
af30: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
af40: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
af50: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
af60: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
af70: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
af80: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
af90: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
afa0: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
afb0: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
afc0: 69 73 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f  is happens. TODO
afd0: 3a 20 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64  : Really, this d
afe0: 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62  oesn't need to b
aff0: 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a  e cleared.    **
b000: 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67   until the chang
b010: 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20  e-counter check 
b020: 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68  fails in PagerSh
b030: 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20  aredLock()..    
b040: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
b050: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
b060: 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f  .    rc = osUnlo
b070: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
b080: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
b090: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61   rc ){.      pPa
b0a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
b0b0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  c;.    }.    IOT
b0c0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b0d0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
b0e0: 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65     /* If Pager.e
b0f0: 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
b100: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b110: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
b120: 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20  annot be.    ** 
b130: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
b140: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
b150: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
b160: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b170: 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63  e.    ** cache c
b180: 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20  an be discarded 
b190: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
b1a0: 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65  de safely cleare
b1b0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
b1c0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
b1d0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  e ){.      if( r
b1e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b1f0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
b200: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
b210: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b220: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
b230: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
b240: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
b250: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
b260: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
b270: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
b280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
b290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
b2a0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
b2b0: 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52  en an IOERR, COR
b2c0: 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72  RUPT or FULL err
b2d0: 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f  or.** may have o
b2e0: 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72  ccurred. The fir
b2f0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
b300: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b310: 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74  pager .** struct
b320: 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
b330: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
b340: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
b350: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a  ned by a pager .
b360: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  ** API function.
b370: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
b380: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
b390: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b3a0: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73  ment .** to this
b3b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
b3c0: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
b3d0: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
b3e0: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
b3f0: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
b400: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
b410: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
b420: 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20  rsistent. Until 
b430: 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72  the persisten er
b440: 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a  ror is cleared,.
b450: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50  ** subsequent AP
b460: 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20  I calls on this 
b470: 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
b480: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
b490: 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72  e same .** error
b4a0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70   code..**.** A p
b4b0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b4c0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
b4d0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b4e0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
b4f0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
b500: 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
b510: 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
b520: 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
b530: 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
b540: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b550: 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
b560: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
b570: 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
b580: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
b590: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
b5a0: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
b5b0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
b5c0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
b5d0: 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
b5e0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b5f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b600: 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
b610: 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
b620: 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
b630: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
b640: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b650: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
b660: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
b670: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
b680: 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
b690: 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
b6a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b6b0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
b6c0: 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
b6d0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b6e0: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
b6f0: 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
b700: 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
b710: 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
b720: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
b730: 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
b740: 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
b750: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b760: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
b770: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
b780: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
b790: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
b7a0: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
b7b0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
b7c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
b7d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
b7e0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
b7f0: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
b800: 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
b810: 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
b820: 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
b830: 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
b840: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
b850: 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
b860: 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
b870: 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
b880: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
b890: 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
b8a0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
b8b0: 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74  file and clear t
b8c0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
b8d0: 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
b8e0: 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  at.** there is a
b8f0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
b900: 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
b910: 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63  stem, the next c
b920: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  onnection.** to 
b930: 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
b940: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
b950: 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
b960: 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a  this one) will.*
b970: 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  * roll it back..
b980: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
b990: 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
b9a0: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
b9b0: 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20  rror state, but 
b9c0: 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
b9d0: 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
b9e0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
b9f0: 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
ba00: 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
ba10: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
ba20: 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
ba30: 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
ba40: 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
ba50: 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
ba60: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
ba70: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
ba80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
ba90: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
baa0: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
bab0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
bac0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
bad0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
bae0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
baf0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
bb00: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
bb10: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
bb20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
bb30: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
bb40: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
bb50: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
bb60: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
bb70: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
bb80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bb90: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
bba0: 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
bbb0: 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
bbc0: 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
bbd0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
bbe0: 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
bbf0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
bc00: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
bc10: 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
bc20: 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
bc30: 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
bc40: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
bc50: 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
bc60: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
bc70: 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
bc80: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
bc90: 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
bca0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
bcb0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
bcc0: 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
bcd0: 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47 45  R_SHARED or PAGE
bce0: 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
bcf0: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
bd00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
bd10: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65  t is a no-op (re
bd20: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29  turns SQLITE_OK)
bd30: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
bd40: 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
bd50: 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
bd60: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
bd70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bd80: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
bd90: 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
bda0: 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
bdb0: 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
bdc0: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
bdd0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
bde0: 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
bdf0: 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
be00: 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
be10: 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
be20: 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
be30: 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
be40: 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
be50: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
be60: 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
be70: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
be80: 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
be90: 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
bea0: 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
beb0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
bec0: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
bed0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
bee0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
bef0: 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
bf00: 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
bf10: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
bf20: 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
bf30: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
bf40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
bf50: 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
bf60: 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
bf70: 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
bf80: 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
bf90: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
bfa0: 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
bfb0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
bfc0: 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
bfd0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
bfe0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
bff0: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
c000: 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
c010: 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
c020: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
c030: 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
c040: 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
c050: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
c060: 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
c070: 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
c080: 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
c090: 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
c0a0: 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
c0b0: 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
c0c0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
c0d0: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
c0e0: 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
c0f0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
c100: 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
c110: 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
c120: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
c130: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
c140: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
c150: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
c160: 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
c170: 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
c180: 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
c190: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
c1a0: 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
c1b0: 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
c1c0: 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
c1d0: 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
c1e0: 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
c1f0: 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
c200: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
c210: 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
c220: 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
c230: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
c240: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c250: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
c260: 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69  alized, if runni
c270: 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
c280: 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ive mode, the.**
c290: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
c2a0: 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
c2b0: 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64  te (and downgrad
c2c0: 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  es the lock on t
c2d0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
c2e0: 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29  ile accordingly)
c2f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
c300: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c310: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c320: 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45  e and is in PAGE
c330: 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a  R_SYNCED state,.
c340: 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50  ** it moves to P
c350: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20  AGER_EXCLUSIVE. 
c360: 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77  No locks are dow
c370: 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e  ngraded when run
c380: 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75  ning in.** exclu
c390: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
c3a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
c3b0: 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
c3c0: 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
c3d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
c3e0: 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
c3f0: 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
c400: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
c410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
c420: 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
c430: 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
c440: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
c450: 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
c460: 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
c470: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
c480: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
c490: 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
c4a0: 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
c4b0: 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
c4c0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
c4d0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
c4e0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c4f0: 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
c500: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
c510: 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
c520: 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
c530: 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
c540: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
c550: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
c560: 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
c570: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
c580: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
c590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c5a0: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c5b0: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
c5c0: 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
c5d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
c5e0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
c5f0: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
c600: 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
c610: 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
c620: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
c630: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
c640: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
c650: 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
c660: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
c670: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c680: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
c690: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
c6a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
c6b0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
c6c0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
c6d0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c6e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
c6f0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
c700: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
c710: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c720: 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46  fd) ){..    /* F
c730: 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
c740: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
c750: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
c760: 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
c770: 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
c780: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
c790: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
c7a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
c7b0: 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
c7c0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c7d0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
c7e0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
c7f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
c800: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c810: 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
c820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c830: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
c840: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c850: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
c860: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
c870: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
c880: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
c890: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c8a0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c8b0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
c8c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c8d0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
c8e0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
c8f0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
c900: 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
c910: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
c920: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c930: 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20  PERSIST.    ){. 
c940: 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
c950: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
c960: 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
c970: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
c980: 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
c990: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c9a0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
c9b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c9c0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
c9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
c9e0: 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
c9f0: 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
ca00: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
ca10: 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20  de==MEMORY if.  
ca20: 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75      ** a hot-jou
ca30: 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f  rnal was just ro
ca40: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68  lled back. In th
ca50: 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
ca60: 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
ca70: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
ca80: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20  ed and deleted. 
ca90: 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  If this connecti
caa0: 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20  on writes to.   
cab0: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
cac0: 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c  se file, it will
cad0: 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20   do so using an 
cae0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
caf0: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  l.  */.      ass
cb00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
cb10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cb20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
cb30: 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
cb40: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
cb50: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
cb60: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
cb70: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
cb80: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cb90: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cba0: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
cbb0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
cbc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cbd0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
cbe0: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
cbf0: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
cc00: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
cc10: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
cc20: 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65  PAGES.    sqlite
cc30: 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
cc40: 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
cc50: 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
cc60: 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66  agehash);.#endif
cc70: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ..    sqlite3Pca
cc80: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
cc90: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
cca0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
ccb0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
ccc0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
ccd0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
cce0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  al = 0;.    pPag
ccf0: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
cd00: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
cd10: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
cd20: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
cd30: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
cd40: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
cd50: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
cd60: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
cd70: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
cd80: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
cd90: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
cda0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
cdb0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
cdc0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cdd0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
cde0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
cdf0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
ce00: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
ce10: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
ce20: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
ce30: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
ce40: 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57   this optimal? W
ce50: 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a  hy is the db siz
ce60: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65  e invalidated he
ce70: 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  re .  ** when th
ce80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
ce90: 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f  is not unlocked?
cea0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
ceb0: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
cec0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
ced0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
cee0: 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
cef0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d  bSize);.  if( !M
cf00: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
cf10: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
cf20: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
cf30: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
cf40: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
cf50: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
cf60: 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
cf70: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
cf80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
cf90: 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
cfa0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
cfb0: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
cfc0: 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
cfd0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
cfe0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
cff0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
d000: 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
d010: 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
d020: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
d030: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
d040: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
d050: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
d060: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
d070: 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
d080: 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
d090: 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
d0a0: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
d0b0: 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
d0c0: 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
d0d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d0e0: 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
d0f0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
d100: 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
d110: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
d120: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
d130: 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
d140: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
d150: 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
d160: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
d170: 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
d180: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
d190: 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
d1a0: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
d1b0: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
d1c0: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
d1d0: 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
d1e0: 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
d1f0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
d200: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
d210: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
d220: 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
d230: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
d240: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
d250: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
d260: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
d270: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
d280: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
d290: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
d2a0: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
d2b0: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
d2c0: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
d2d0: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
d2e0: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
d2f0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
d300: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
d310: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
d320: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
d330: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
d340: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
d350: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
d360: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
d370: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
d380: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
d390: 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
d3a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d3b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
d3c0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
d3d0: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
d3e0: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
d3f0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
d400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
d410: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d420: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
d430: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
d440: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
d450: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
d460: 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
d470: 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
d480: 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
d490: 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
d4a0: 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
d4b0: 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
d4c0: 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
d4d0: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
d4e0: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
d4f0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d500: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
d510: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
d520: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
d530: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
d540: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
d550: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d560: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
d570: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
d580: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
d590: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
d5a0: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
d5b0: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
d5c0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
d5d0: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
d5e0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
d5f0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
d600: 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
d610: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
d620: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
d630: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
d640: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
d650: 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
d660: 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
d670: 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
d680: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d690: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
d6a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
d6b0: 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
d6c0: 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
d6d0: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
d6e0: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
d6f0: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
d700: 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
d710: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
d720: 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
d730: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
d740: 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
d750: 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
d760: 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
d770: 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
d780: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
d790: 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
d7a0: 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
d7b0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
d7c0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
d7d0: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
d7e0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
d7f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
d800: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
d810: 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
d820: 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
d830: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d840: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d850: 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
d860: 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
d870: 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
d880: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
d890: 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
d8a0: 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
d8b0: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
d8c0: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d8d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
d8e0: 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
d8f0: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
d900: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
d910: 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
d920: 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
d930: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
d940: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
d950: 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
d960: 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
d970: 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
d980: 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
d990: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
d9a0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
d9b0: 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
d9c0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
d9d0: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
d9e0: 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
d9f0: 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
da00: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
da10: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
da20: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
da30: 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
da40: 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
da50: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
da60: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
da70: 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
da80: 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
da90: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
daa0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
dab0: 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
dac0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
dad0: 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
dae0: 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
daf0: 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
db00: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
db10: 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
db20: 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
db30: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
db40: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
db50: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
db60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
db70: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
db80: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
db90: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
dba0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
dbb0: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
dbc0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
dbd0: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
dbe0: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
dbf0: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
dc00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
dc10: 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c  .  int isUnsync,
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
dc40: 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65  ing from unsynce
dc50: 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  d main journal *
dc60: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
dc70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc80: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
dc90: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
dca0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  k */.  int isSav
dcb0: 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  epnt,           
dcc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
dcd0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dce0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  lback */.  Bitve
dcf0: 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20  c *pDone        
dd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
dd10: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
dd20: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
dd30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
dd40: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
dd70: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
dd80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
ddb0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
ddc0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
ddd0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ddf0: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
de00: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
de10: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
de20: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
de30: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
de40: 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
de50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
de60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
de70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
de80: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
de90: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
dea0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  al file */..  as
deb0: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
dec0: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
ded0: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
dee0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
def0: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
df00: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
df10: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
df20: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
df30: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
df40: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
df50: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
df60: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
df70: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
df80: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
df90: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
dfa0: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
dfb0: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
dfc0: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
dfd0: 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  (u8*)pPager->pTm
dfe0: 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
dff0: 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
e000: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
e010: 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
e020: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
e030: 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  ted */..  /* Rea
e040: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
e050: 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
e060: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e070: 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
e080: 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
e090: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
e0a0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
e0b0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e0c0: 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
e0d0: 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
e0e0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
e0f0: 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
e100: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
e110: 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
e120: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
e130: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e140: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
e150: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
e160: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
e170: 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
e180: 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
e190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e1a0: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
e1b0: 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
e1c0: 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
e1d0: 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
e1e0: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
e1f0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
e200: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
e210: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
e220: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
e230: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
e240: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
e250: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
e260: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
e270: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
e280: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
e290: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
e2a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e2b0: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
e2c0: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
e2d0: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
e2e0: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
e2f0: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
e300: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
e310: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
e320: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
e330: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e340: 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
e350: 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
e360: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
e370: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
e380: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
e390: 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
e3a0: 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
e3b0: 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
e3c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e3d0: 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
e3e0: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
e3f0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
e400: 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
e410: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
e420: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e430: 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
e440: 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
e450: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
e460: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
e480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e490: 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
e4a0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
e4b0: 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
e4c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e4d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e4e0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
e4f0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e500: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
e510: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e520: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
e530: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
e540: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
e550: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
e560: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
e570: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
e580: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
e590: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
e5a0: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
e5b0: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
e5c0: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
e5d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
e5e0: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
e5f0: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
e600: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
e610: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
e620: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
e630: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
e640: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
e650: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
e660: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
e670: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
e680: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
e690: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
e6a0: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
e6b0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e6c0: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
e6d0: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
e6e0: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
e6f0: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
e700: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
e710: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
e720: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
e730: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
e740: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
e750: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
e760: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
e770: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
e780: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
e790: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
e7a0: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
e7b0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
e7c0: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
e7d0: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
e7e0: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
e7f0: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
e800: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
e810: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
e820: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
e830: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
e840: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
e850: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
e860: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
e870: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
e880: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
e890: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
e8a0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
e8b0: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
e8c0: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
e8d0: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
e8e0: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
e8f0: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
e900: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
e910: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
e920: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
e930: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
e940: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
e950: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
e960: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
e970: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
e980: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
e990: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
e9a0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
e9b0: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
e9c0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
e9d0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
e9e0: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
e9f0: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
ea00: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
ea10: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
ea20: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
ea30: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
ea40: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
ea50: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
ea60: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
ea70: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
ea80: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
ea90: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
eaa0: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
eab0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
eac0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ead0: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
eae0: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
eaf0: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
eb00: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
eb10: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
eb20: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
eb30: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
eb40: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
eb50: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
eb60: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
eb70: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
eb80: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
eb90: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
eba0: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
ebb0: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
ebc0: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
ebd0: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
ebe0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
ebf0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
ec00: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
ec10: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
ec20: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
ec30: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
ec40: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
ec50: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
ec60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
ec70: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
ec80: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
ec90: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
eca0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ecb0: 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
ecc0: 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
ecd0: 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
ece0: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
ecf0: 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
ed10: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
ed20: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
ed30: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
ed40: 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20  ize, aData),.   
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d              (isM
ed60: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
ed70: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
ed80: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
ed90: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
eda0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
edb0: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
edc0: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
edd0: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
ede0: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
edf0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
ee00: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
ee10: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
ee20: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
ee30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ee40: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ee50: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
ee60: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
ee70: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
ee80: 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
ee90: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
eea0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
eeb0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
eec0: 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
eed0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
eee0: 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
eef0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
ef00: 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
ef10: 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
ef20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
ef30: 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
ef40: 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
ef50: 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20  o, aData);.     
ef60: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
ef70: 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c 20  aData, pgno, 0, 
ef80: 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
ef90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
efa0: 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
efb0: 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
efc0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
efd0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
efe0: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
eff0: 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
f000: 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
f010: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
f020: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
f030: 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
f040: 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
f050: 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
f060: 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
f070: 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
f080: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
f090: 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
f0a0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
f0b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
f0c0: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
f0d0: 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
f0e0: 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
f0f0: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
f100: 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
f110: 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
f120: 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
f130: 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
f140: 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
f150: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
f160: 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
f170: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
f180: 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
f190: 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
f1a0: 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
f1b0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
f1c0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
f1d0: 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
f1e0: 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
f1f0: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
f200: 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
f210: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
f220: 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
f230: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
f240: 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
f250: 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
f260: 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
f270: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
f280: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
f290: 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
f2a0: 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
f2b0: 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
f2c0: 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
f2d0: 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
f2e0: 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
f2f0: 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
f300: 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
f310: 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
f320: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
f330: 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
f340: 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
f350: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
f360: 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
f370: 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49   &pPg, 1))!=SQLI
f380: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f390: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f3a0: 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26      pPg->flags &
f3b0: 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45  = ~PGHDR_NEED_RE
f3c0: 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  AD;.    sqlite3P
f3d0: 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
f3e0: 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
f3f0: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
f400: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
f410: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
f420: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
f430: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
f440: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
f450: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
f460: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
f470: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
f480: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
f490: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
f4a0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
f4b0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
f4c0: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
f4d0: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
f4e0: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
f4f0: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
f500: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
f510: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
f520: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
f530: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
f540: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
f550: 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
f560: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
f570: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
f580: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
f590: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f5a0: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
f5b0: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
f5c0: 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
f5d0: 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
f5e0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
f5f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f600: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
f610: 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
f620: 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
f630: 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
f640: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
f650: 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
f660: 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
f670: 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
f680: 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
f690: 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
f6a0: 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
f6b0: 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
f6c0: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
f6d0: 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
f6e0: 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
f6f0: 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
f700: 69 74 20 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20  it out to the.. 
f710: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
f720: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
f730: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
f740: 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
f750: 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
f760: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
f770: 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
f780: 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
f790: 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
f7a0: 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
f7b0: 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
f7c0: 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
f7d0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
f7e0: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
f7f0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
f800: 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
f810: 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
f820: 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
f830: 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
f840: 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
f850: 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
f860: 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
f870: 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
f880: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
f890: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
f8a0: 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
f8b0: 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
f8c0: 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
f8d0: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
f8e0: 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
f8f0: 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
f900: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
f910: 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
f920: 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
f930: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
f940: 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
f950: 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
f960: 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
f970: 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
f980: 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
f990: 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
f9a0: 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
f9b0: 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
f9c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f9d0: 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
f9e0: 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
f9f0: 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
fa00: 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
fa10: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
fa20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
fa30: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
fa40: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
fa50: 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
fa60: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  /.      sqlite3P
fa70: 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
fa80: 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
fa90: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
faa0: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
fab0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
fac0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
fad0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
fae0: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
faf0: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
fb00: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
fb10: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
fb20: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
fb30: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
fb40: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
fb50: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
fb60: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
fb70: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
fb80: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
fb90: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
fba0: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
fbb0: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
fbc0: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
fbd0: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
fbe0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
fbf0: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
fc00: 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
fc10: 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
fc20: 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
fc30: 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
fc40: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
fc50: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
fc60: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
fc70: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
fc80: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
fc90: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
fca0: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
fcb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fcc0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
fcd0: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
fce0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
fcf0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
fd00: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
fd10: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
fd20: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
fd30: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
fd40: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
fd50: 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
fd60: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
fd70: 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
fd80: 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
fd90: 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
fda0: 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
fdb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
fdc0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
fdd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
fde0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
fdf0: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
fe00: 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
fe10: 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
fe20: 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
fe30: 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
fe40: 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
fe50: 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
fe60: 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
fe70: 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
fe80: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
fe90: 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
fea0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
feb0: 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
fec0: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
fed0: 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
fee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
fef0: 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
ff00: 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
ff10: 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
ff20: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
ff30: 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
ff40: 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
ff50: 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
ff60: 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
ff70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ff80: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
ff90: 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
ffa0: 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
ffb0: 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
ffc0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
ffd0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ffe0: 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
fff0: 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
10000 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
10010 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
10020 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
10030 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
10040 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
10050 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
10060 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
10070 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
10080 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
10090 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
100a0 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
100b0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
100c0 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
100d0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
100e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
100f0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
10100 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
10110 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
10120 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
10130 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
10140 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
10150 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
10160 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
10170 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
10180 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
10190 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
101a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
101b0 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
101c0 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
101d0 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
101e0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
101f0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10200 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
10210 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
10220 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
10230 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
10240 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
10250 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10260 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
10270 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
10280 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
10290 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
102a0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
102b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
102c0 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
102d0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
102e0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
102f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10300 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
10310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10320 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
10330 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
10340 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
10350 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
10360 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
10370 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
10380 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
10390 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
103a0 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
103b0 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
103c0 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
103d0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
103e0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
103f0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10400 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10410 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
10420 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
10430 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
10440 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10450 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10460 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
10470 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
10480 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
10490 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
104a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
104b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
104c0 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
104d0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
104e0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
104f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
10500 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
10510 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
10520 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
10530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10540 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
10550 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
10560 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
10570 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
10580 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
10590 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
105a0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
105b0 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
105c0 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
105d0 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
105e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
105f0 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
10600 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
10610 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
10620 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
10630 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
10640 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
10650 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
10660 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
10670 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
10680 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
10690 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
106a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
106b0 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
106c0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
106d0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
106e0 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
106f0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
10700 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
10710 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
10720 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
10730 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
10740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
10750 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
10760 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10770 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
10780 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
10790 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
107a0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
107b0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
107c0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
107d0 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
107e0 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
107f0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
10800 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
10810 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
10820 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
10830 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
10840 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
10850 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
10860 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
10870 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
10880 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
10890 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
108a0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
108b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
108c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
108d0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
108e0 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
108f0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
10900 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
10910 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
10920 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
10930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
10940 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
10950 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10960 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
10970 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
10980 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
10990 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63  urnal+1];.    rc
109a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
109b0 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
109c0 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
109d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
109e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
109f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
10a00 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
10a10 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
10a20 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
10a30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75  ] = 0;..    zJou
10a40 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
10a50 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
10a60 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
10a70 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
10a80 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
10a90 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
10aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10ab0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
10ac0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
10ad0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
10ae0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
10af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
10b10 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
10b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b30 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
10b40 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
10b50 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
10b60 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
10b70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
10b80 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
10b90 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
10ba0 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
10bb0 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
10bc0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
10bd0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
10be0 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
10bf0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10c00 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
10c10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
10c20 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
10c30 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
10c40 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
10c50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
10c60 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
10c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
10c80 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
10c90 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
10ca0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
10cb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10cc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10cd0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10ce0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
10cf0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
10d00 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
10d10 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
10d20 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
10d30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10d40 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
10d50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
10d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10d70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
10d80 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
10d90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
10da0 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
10db0 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
10dc0 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
10dd0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
10de0 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
10df0 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
10e00 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
10e10 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
10e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
10e30 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
10e40 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10e60 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
10e70 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
10e80 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
10e90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
10ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10eb0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
10ec0 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
10ed0 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
10ee0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
10ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
10f00 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
10f10 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
10f20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
10f30 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
10f40 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
10f50 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
10f60 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73  rnal) );.  }.  s
10f70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
10f80 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
10f90 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
10fa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
10fb0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
10fc0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
10fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
10fe0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
10ff0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
11000 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
11010 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
11020 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
11030 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
11040 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
11050 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
11060 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11070 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
11080 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
11090 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
110a0 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
110b0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
110c0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
110d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
110e0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
110f0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
11100 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
11110 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
11120 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
11130 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
11140 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
11150 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
11160 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
11170 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
11180 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
11190 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
111a0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
111b0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
111c0 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
111d0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
111e0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
111f0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
11200 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
11210 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11220 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
11230 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
11240 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
11250 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
11260 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
11270 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
11280 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
11290 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
112a0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
112b0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
112c0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
112d0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
112e0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
112f0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
11300 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
11310 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
11320 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
11330 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
11340 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
11350 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
11360 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
11370 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
11380 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11390 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
113a0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
113b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
113c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
113d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
113e0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
113f0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
11400 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
11410 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
11420 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
11430 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
11440 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
11450 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
11460 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11470 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11480 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
11490 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
114a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
114b0 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
114c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
114d0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
114e0 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
114f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
11500 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
11510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11520 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11530 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
11540 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
11550 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
11560 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11570 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
11580 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
11590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
115a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
115b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
115c0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
115d0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
115e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
115f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11600 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
11610 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
11620 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
11630 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
11640 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
11650 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
11660 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
11670 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
11680 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
11690 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
116a0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
116b0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
116c0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
116d0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
116e0 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
116f0 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
11700 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11710 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
11720 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
11730 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
11740 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
11750 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
11760 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
11770 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
11780 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
11790 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
117a0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
117b0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
117c0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
117d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
117e0 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
117f0 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
11800 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69 74   to 512 if.** it
11810 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 35 31   is less than 51
11820 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
11830 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
11840 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
11850 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
11860 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
11870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11880 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
11890 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
118a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
118b0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
118c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
118d0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
118e0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
118f0 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
11900 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
11910 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
11920 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
11930 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
11940 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
11950 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
11960 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
11970 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
11980 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
11990 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
119a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
119b0 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
119c0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
119d0 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
119e0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
119f0 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
11a00 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
11a10 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28  = 512;.  }.  if(
11a20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
11a30 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
11a40 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
11a50 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
11a60 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70  ZE>=512 );.    p
11a70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
11a80 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  e = MAX_SECTOR_S
11a90 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IZE;.  }.}../*.*
11aa0 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
11ab0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
11ac0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
11ad0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
11ae0 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
11af0 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
11b00 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
11b10 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
11b20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
11b30 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
11b40 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
11b50 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
11b60 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
11b70 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
11b80 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
11b90 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
11ba0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
11bb0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
11bc0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
11bd0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
11be0 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
11bf0 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
11c00 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
11c10 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
11c20 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
11c30 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
11c40 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
11c50 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
11c60 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
11c70 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
11c80 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
11c90 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
11ca0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
11cb0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
11cc0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
11cd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
11ce0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
11cf0 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
11d00 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
11d10 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
11d20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
11d30 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
11d40 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
11d50 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
11d60 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
11d70 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
11d80 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
11d90 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
11da0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
11db0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
11dc0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
11dd0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
11de0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
11df0 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
11e00 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
11e10 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
11e20 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
11e30 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
11e40 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
11e50 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
11e60 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
11e70 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
11e80 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
11e90 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
11ea0 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
11eb0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
11ec0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
11ed0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
11ee0 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
11ef0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
11f00 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
11f10 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
11f20 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
11f30 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
11f40 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
11f50 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
11f60 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
11f70 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
11f80 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
11f90 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
11fa0 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
11fb0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
11fc0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
11fd0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
11fe0 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
11ff0 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
12000 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
12010 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
12020 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
12030 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
12040 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
12050 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
12060 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
12070 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
12080 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
12090 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
120a0 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
120b0 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
120c0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
120d0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
120e0 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
120f0 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
12100 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
12110 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
12120 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
12130 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
12140 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
12150 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
12160 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
12170 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
12180 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
12190 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
121a0 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
121b0 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
121c0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
121d0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
121e0 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
121f0 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
12200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
12210 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
12220 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
12230 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
12240 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
12250 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
12260 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
12270 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
12280 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
12290 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
122a0 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
122b0 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
122c0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
122d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
122e0 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
122f0 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
12300 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
12310 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
12320 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
12330 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
12340 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
12350 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
12360 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
12370 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
12380 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
12390 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
123a0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
123b0 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
123c0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
123d0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
123e0 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
123f0 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
12400 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
12410 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
12420 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
12430 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
12440 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
12450 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
12460 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
12470 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
12480 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
12490 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
124a0 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
124b0 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
124c0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
124d0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
124e0 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
124f0 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
12500 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
12510 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
12520 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
12530 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
12540 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
12550 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
12560 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
12570 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
12580 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
12590 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
125a0 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
125b0 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
125c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
125d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
125e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
125f0 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
12600 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
12610 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
12620 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
12630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12640 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12650 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
12660 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12680 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
12690 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
126a0 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
126c0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
126d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
126e0 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
126f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12700 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
12710 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
12720 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
12730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
12740 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
12750 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
12760 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
12770 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
12780 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
12790 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
127a0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
127b0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
127c0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
127d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
127e0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
127f0 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
12800 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
12810 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
12820 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
12830 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ck */..  /* Figu
12840 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
12850 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
12860 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
12870 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
12880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12890 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
128a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
128b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
128c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
128d0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
128e0 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
128f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12900 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
12910 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
12920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
12930 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12940 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
12950 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
12960 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
12970 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
12980 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
12990 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
129a0 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
129b0 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
129c0 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
129d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
129e0 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
129f0 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
12a00 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
12a10 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
12a20 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
12a30 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
12a40 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
12a50 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
12a60 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
12a70 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
12a80 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
12a90 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
12aa0 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
12ab0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
12ac0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
12ad0 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
12ae0 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
12af0 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  *  mxPathname is
12b00 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
12b10 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
12b20 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
12b30 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
12b40 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
12b50 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
12b60 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
12b70 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
12b80 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
12b90 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
12ba0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
12bb0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
12bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12bd0 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
12be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12bf0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
12c00 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
12c10 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
12c20 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
12c30 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
12c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
12c50 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
12c60 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
12c70 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12c80 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
12c90 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
12ca0 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
12cb0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
12cc0 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
12cd0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
12ce0 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
12cf0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
12d00 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
12d10 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
12d20 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
12d30 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
12d40 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
12d50 69 6e 74 20 69 73 55 6e 73 79 6e 63 20 3d 20 30  int isUnsync = 0
12d60 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
12d70 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
12d80 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
12d90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
12da0 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
12db0 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
12dc0 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
12dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
12de0 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
12df0 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
12e00 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
12e10 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
12e20 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
12e30 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
12e40 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
12e50 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
12e60 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
12e70 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
12e80 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
12e90 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
12ea0 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
12eb0 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
12ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12ed0 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
12ee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
12ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12f10 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
12f20 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
12f30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
12f40 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
12f50 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
12f60 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
12f70 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
12f80 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
12f90 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
12fa0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
12fb0 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
12fc0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
12fd0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
12fe0 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
12ff0 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
13000 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
13010 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
13020 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
13030 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
13040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13050 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
13060 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
13070 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13080 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13090 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
130a0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
130b0 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
130c0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
130d0 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
130e0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
130f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
13100 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
13110 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
13120 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
13130 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
13140 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
13150 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
13160 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
13170 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
13180 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
13190 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
131a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
131b0 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
131c0 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
131d0 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
131e0 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
131f0 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
13200 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
13210 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
13220 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
13230 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
13240 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
13250 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
13260 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
13270 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
13280 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
13290 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
132a0 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
132b0 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
132c0 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
132d0 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
132e0 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
132f0 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
13300 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
13310 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
13320 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
13330 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
13340 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
13350 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
13360 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
13370 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13380 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
13390 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
133a0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
133b0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
133c0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
133d0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
133e0 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
133f0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13400 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
13410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
13420 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
13430 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
13440 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
13450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13460 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
13470 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
13480 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
13490 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
134a0 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
134b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
134c0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
134d0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73  ager));.      is
134e0 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  Unsync = 1;.    
134f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
13500 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
13510 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
13520 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
13530 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
13540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
13550 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
13560 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
13570 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
13580 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
13590 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
135a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
135b0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
135c0 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
135d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
135e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
135f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
13600 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
13610 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
13620 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
13630 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
13640 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
13650 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13660 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
13670 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
13680 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
13690 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
136a0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
136b0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
136c0 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
136d0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
136e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
136f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
13700 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
13710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13720 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
13730 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
13740 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26  ger,1,isUnsync,&
13750 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13760 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69  ff,0,0);.      i
13770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13780 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13790 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
137a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
137b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
137c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
137d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
137e0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
137f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13800 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
13810 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
13820 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
13830 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
13840 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
13850 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
13860 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
13870 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
13880 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
13890 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
138a0 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
138b0 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
138c0 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
138d0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
138e0 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
138f0 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
13900 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
13910 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
13920 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13930 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
13940 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
13950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13960 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
13970 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
13980 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
13990 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
139a0 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
139b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
139c0 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
139d0 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
139e0 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
139f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13a00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
13a10 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
13a20 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
13a30 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
13a40 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
13a50 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
13a60 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
13a70 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
13a80 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
13a90 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  odified..  */.  
13aa0 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67  assert(.    pPag
13ab0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
13ac0 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74  ==0 ||.    sqlit
13ad0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
13ae0 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54  pPager->fd,SQLIT
13af0 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
13b00 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f  NGED,0)>=SQLITE_
13b10 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  OK.  );..  /* If
13b20 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
13b30 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
13b40 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
13b50 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
13b60 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
13b70 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
13b80 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
13b90 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
13ba0 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
13bb0 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
13bc0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
13bd0 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
13be0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
13bf0 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
13c00 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
13c10 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
13c20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
13c30 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
13c40 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
13c50 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
13c60 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
13c70 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
13c80 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
13c90 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
13ca0 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
13cb0 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
13cc0 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
13cd0 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
13ce0 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
13cf0 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
13d00 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
13d10 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
13d20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
13d30 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
13d40 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
13d50 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
13d60 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
13d70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
13d80 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
13d90 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
13da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13db0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
13dc0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
13dd0 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
13de0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
13df0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
13e00 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
13e10 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
13e20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
13e30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
13e40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13e60 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
13e70 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
13e80 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
13e90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
13ea0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13eb0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
13ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
13ed0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
13ee0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
13ef0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
13f00 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
13f10 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
13f20 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
13f30 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
13f40 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
13f50 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
13f60 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
13f70 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
13f80 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
13f90 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
13fa0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
13fb0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
13fc0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
13fd0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
13fe0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
13ff0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
14000 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
14010 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
14020 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
14030 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
14040 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
14050 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
14060 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
14070 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
14080 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
14090 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
140a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
140b0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
140c0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
140d0 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
140e0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
140f0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
14100 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
14110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14120 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
14130 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
14140 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
14150 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
14160 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
14170 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
14180 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
14190 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
141a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
141b0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
141c0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
141d0 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
141e0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
141f0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
14200 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
14210 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
14220 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
14230 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
14240 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
14250 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
14260 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
14270 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
14280 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14290 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
142a0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
142b0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
142c0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
142d0 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
142e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
142f0 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
14300 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14310 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
14320 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
14330 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14340 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
14350 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
14360 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14370 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
14380 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
14390 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
143a0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
143b0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
143c0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
143d0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
143e0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
143f0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
14400 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14410 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
14420 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
14430 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
14440 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
14450 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
14460 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
14470 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
14480 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
14490 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
144a0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
144b0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
144c0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
144d0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
144e0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
144f0 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
14500 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
14510 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
14520 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
14530 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
14540 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
14550 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
14560 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14570 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
14580 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
14590 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
145a0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
145b0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
145c0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
145d0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
145e0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
145f0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
14600 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
14610 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
14620 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
14630 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
14640 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
14650 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
14660 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
14670 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
14680 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
14690 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
146a0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
146b0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
146c0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
146d0 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
146e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
146f0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
14700 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
14710 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
14720 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
14730 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
14740 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
14750 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
14760 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
14770 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
14780 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14790 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
147a0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
147b0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
147c0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
147d0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
14800 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
14810 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
14820 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
14830 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
14840 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
14850 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
14860 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
14870 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14880 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14890 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
148a0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
148b0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
148c0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
148d0 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
148e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
148f0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
14900 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
14910 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
14920 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
14930 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
14940 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
14950 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
14960 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
14970 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
14980 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
14990 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
149a0 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
149b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
149c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
149d0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
149e0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
149f0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
14a00 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
14a10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
14a20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
14a30 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
14a40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
14a50 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
14a60 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
14a70 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
14a80 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a  bOrigSize;..  /*
14a90 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
14aa0 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
14ab0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
14ac0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
14ad0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
14ae0 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
14af0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
14b00 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
14b10 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
14b20 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
14b30 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
14b40 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
14b50 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
14b60 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
14b70 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
14b80 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
14b90 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
14ba0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
14bb0 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
14bc0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
14bd0 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
14be0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
14bf0 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
14c00 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
14c10 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
14c20 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
14c30 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
14c40 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
14c50 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
14c60 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
14c70 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
14c80 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
14c90 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14ca0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
14cb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
14cc0 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
14cd0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
14ce0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
14cf0 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
14d00 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
14d10 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
14d20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
14d30 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
14d40 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
14d50 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
14d60 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
14d70 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
14d80 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
14d90 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
14da0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
14db0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
14dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
14dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14de0 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
14df0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14e00 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
14e10 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50  Pager, 1, 0, &pP
14e20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14e30 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
14e40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
14e50 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
14e60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14e70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14e80 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
14e90 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
14ea0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
14eb0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
14ec0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
14ed0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
14ee0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
14ef0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
14f00 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
14f10 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
14f20 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
14f30 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
14f40 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
14f50 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
14f60 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
14f70 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
14f80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
14f90 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
14fa0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
14fb0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
14fc0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
14fd0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
14fe0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14ff0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
15000 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
15010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
15020 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
15030 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
15040 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
15050 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
15060 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
15070 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
15080 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15090 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
150a0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
150b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
150c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
150d0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
150e0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
150f0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
15100 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
15110 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
15120 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
15130 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
15140 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
15150 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
15160 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
15170 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
15180 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
15190 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
151a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
151b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
151c0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
151d0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
151e0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
151f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
15200 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
15210 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
15220 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
15230 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
15240 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
15250 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
15260 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
15270 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
15280 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
15290 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d  , 1, 0, &pPager-
152a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
152b0 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
152c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
152d0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
152e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
152f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
15300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
15310 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
15320 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
15330 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
15340 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
15350 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
15360 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
15370 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
15380 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15390 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
153a0 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
153b0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
153c0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
153d0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
153e0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
153f0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
15400 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15410 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15420 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
15430 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f  offset = pSavepo
15440 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
15450 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15460 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53  );.    for(ii=pS
15470 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
15480 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
15490 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
154a0 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
154b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
154c0 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65  set==ii*(4+pPage
154d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
154e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
154f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15500 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c  ge(pPager, 0, 0,
15510 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f   &offset, 1, pDo
15520 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15530 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15540 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
15550 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
15560 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
15570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15580 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
15590 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
155a0 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  J;.  }.  return 
155b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
155c0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
155d0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
155e0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
155f0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
15600 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
15610 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
15620 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
15630 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
15640 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
15650 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
15660 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
15670 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
15680 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
15690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
156a0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
156b0 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
156c0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
156d0 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
156e0 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
156f0 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
15700 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
15710 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
15720 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
15730 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
15740 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
15750 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
15760 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
15770 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
15780 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
15790 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
157a0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
157b0 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
157c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
157d0 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
157e0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
157f0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
15800 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
15810 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
15820 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
15830 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
15840 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
15850 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
15860 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
15870 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
15880 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
15890 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
158a0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
158b0 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
158c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
158d0 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
158e0 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
158f0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
15900 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
15910 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
15920 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
15930 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
15940 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
15950 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
15960 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
15970 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
15990 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
159a0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
159b0 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
159c0 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
159d0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
159e0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
159f0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
15a00 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
15a10 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
15a20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
15a30 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
15a40 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
15a50 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
15a60 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
15a70 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
15a80 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
15aa0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
15ab0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
15ac0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
15ad0 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
15ae0 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
15af0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
15b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
15b10 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
15b20 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
15b30 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
15b40 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
15b50 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
15b60 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
15b70 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
15b80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
15b90 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
15ba0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
15bb0 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
15bc0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
15bd0 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
15be0 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
15bf0 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
15c00 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
15c10 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
15c20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
15c30 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
15c40 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
15c50 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
15c60 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
15c70 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
15c80 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
15c90 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
15ca0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15cb0 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
15cc0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
15cd0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15ce0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
15cf0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
15d00 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
15d10 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
15d20 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
15d30 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
15d40 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
15d50 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
15d60 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
15d70 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
15d80 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
15d90 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
15da0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
15db0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
15dc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
15dd0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
15de0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
15df0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15e00 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
15e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
15e20 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
15e30 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
15e40 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
15e50 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
15e60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
15e70 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
15e80 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
15e90 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
15ea0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
15eb0 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
15ec0 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
15ed0 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
15ee0 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
15ef0 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
15f00 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
15f10 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
15f20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15f30 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
15f40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
15f50 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
15f60 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
15f70 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
15f80 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
15f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
15fa0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
15fb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
15fd0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
15fe0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
15ff0 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
16000 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16010 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
16020 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
16030 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
16040 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
16050 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
16060 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16070 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16080 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
16090 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
160a0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
160b0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
160c0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
160d0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
160e0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
160f0 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
16100 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
16110 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16120 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
16130 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
16140 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
16150 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
16160 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16170 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
16180 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
16190 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
161a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
161b0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
161c0 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
161d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
161e0 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
161f0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
16200 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
16210 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
16220 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
16230 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
16240 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
16250 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
16260 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
16270 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
16280 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
16290 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
162a0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
162b0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
162c0 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
162d0 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
162e0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
162f0 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
16300 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
16310 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
16320 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
16330 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
16340 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
16350 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
16360 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
16370 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
16380 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
16390 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
163c0 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16400 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
16410 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
16420 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
16430 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
16440 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
16450 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
16460 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
16470 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
16480 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
16490 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
164a0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
164b0 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
164c0 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
164d0 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
164e0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
164f0 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
16500 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
16510 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
16520 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
16530 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
16540 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16550 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
16560 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
16570 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
16580 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
16590 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
165a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
165b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
165c0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
165d0 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
165e0 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
165f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16600 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
16610 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
16620 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
16630 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
16640 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
16650 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
16660 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70  dler */.){  .  p
16670 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
16680 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
16690 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
166a0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
166b0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
166c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
166d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
166e0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
166f0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
16700 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
16710 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
16720 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16730 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
16740 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16750 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16760 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
16770 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
16780 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
16790 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
167a0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
167b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
167e0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
167f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
16800 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
16810 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
16820 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
16830 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
16840 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
16850 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
16860 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
16870 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
16880 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
16890 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
168a0 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
168b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
168c0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
168d0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
168e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
168f0 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
16900 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
16910 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
16920 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
16930 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
16940 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
16950 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
16960 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c  E_CORRUPT or SQL
16970 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
16980 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
16990 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
169a0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
169b0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
169c0 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
169d0 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
169e0 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
169f0 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
16a00 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16a10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
16a20 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
16a30 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
16a40 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
16a50 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
16a60 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
16a70 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
16a80 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
16a90 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
16aa0 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
16ab0 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
16ac0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16ad0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
16ae0 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
16af0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
16b00 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
16b10 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
16b20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
16b30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
16b40 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
16b50 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
16b60 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
16b70 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
16b80 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
16b90 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
16ba0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
16bb0 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
16bc0 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
16bd0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
16be0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
16bf0 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
16c00 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
16c10 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
16c20 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
16c30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
16c50 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
16c60 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
16c70 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
16c80 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
16c90 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
16ca0 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
16cb0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
16cc0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
16cd0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
16ce0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
16cf0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
16d00 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
16d10 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
16d20 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
16d30 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
16d40 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
16d50 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
16d60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
16d70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
16d80 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
16d90 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50  *pPager, u16 *pP
16da0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
16db0 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
16dc0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
16dd0 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  de;..  if( rc==S
16de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16df0 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
16e00 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  pPageSize;.    a
16e10 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
16e20 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
16e30 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
16e40 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
16e50 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69  E_SIZE) );.    i
16e60 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
16e70 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
16e80 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20  dbSize==0).     
16e90 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
16ea0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
16eb0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
16ec0 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
16ed0 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
16ee0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
16ef0 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
16f00 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
16f10 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
16f20 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
16f30 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
16f40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16f50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
16f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f70 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
16f80 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
16f90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
16fa0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
16fb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
16fc0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
16fd0 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ace);.        pP
16fe0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
16ff0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
17000 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
17010 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
17020 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
17030 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
17040 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a   }.    *pPageSiz
17050 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  e = (u16)pPager-
17060 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69  >pageSize;.    i
17070 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
17080 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
17090 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
170a0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
170b0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
170c0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
170d0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
170e0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
170f0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
17100 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
17110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17120 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
17130 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
17140 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
17150 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
17160 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
17170 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
17180 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
17190 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
171a0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
171b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
171c0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
171d0 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
171e0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
171f0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
17200 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
17210 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
17220 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
17230 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
17240 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
17250 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
17260 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
17270 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
17280 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
17290 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
172a0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
172b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
172c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
172d0 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
172e0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
172f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
17300 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
17310 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
17320 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
17330 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
17340 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
17350 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
17360 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
17370 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
17380 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
17390 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
173a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
173b0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
173c0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
173d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
173e0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
173f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17400 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
17410 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17420 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
17430 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
17440 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
17450 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
17460 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17470 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
17480 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
17490 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
174a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
174b0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
174c0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
174d0 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
174e0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
174f0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
17500 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
17510 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
17520 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
17530 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
17540 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
17550 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
17560 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
17570 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
17580 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
17590 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
175a0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
175b0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
175c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
175d0 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
175e0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
175f0 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
17600 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
17610 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
17620 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
17630 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
17640 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17650 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
17660 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
17670 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
17680 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
17690 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
176a0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
176b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
176c0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
176d0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
176e0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
176f0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
17700 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
17710 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
17720 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
17730 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17740 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
17750 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
17760 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
17770 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
17780 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
17790 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
177a0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
177b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
177c0 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
177d0 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
177e0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
177f0 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
17800 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
17810 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
17820 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
17830 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
17840 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
17850 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
17860 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
17870 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
17880 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
17890 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
178a0 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
178b0 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
178c0 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
178d0 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
178e0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
178f0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
17900 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
17910 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
17920 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
17930 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
17940 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
17950 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
17960 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
17970 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
17980 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
17990 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
179a0 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
179b0 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
179c0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
179d0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
179e0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
179f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
17a00 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
17a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
17a20 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
17a30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
17a40 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
17a50 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
17a60 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  le );.  if( isOp
17a70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
17a80 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
17a90 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
17aa0 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
17ab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17ac0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
17ad0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
17ae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17af0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
17b00 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
17b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17b20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17b30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17b40 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
17b50 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17b60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17b70 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  e associated .**
17b80 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f   with pPager. No
17b90 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  rmally, this is 
17ba0 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c  calculated as (<
17bb0 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70  db file size>/<p
17bc0 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48  age-size>)..** H
17bd0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
17be0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
17bf0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
17c00 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
17c10 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
17c20 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
17c30 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  page file..**.**
17c40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17c50 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
17c60 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
17c70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
17c80 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  en the.** error 
17c90 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
17ca0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
17cb0 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e   *pnPage left un
17cc0 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20  changed. Or,.** 
17cd0 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  if the file syst
17ce0 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65  em has to be que
17cf0 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a  ried for the siz
17d00 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  e of the file an
17d10 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61  d.** the query a
17d20 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61  ttempt returns a
17d30 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20  n IO error, the 
17d40 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
17d50 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
17d60 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
17d70 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
17d80 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
17d90 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
17da0 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53  ccessful, then S
17db0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17dc0 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
17dd0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  age is set to th
17de0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
17df0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17e00 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17e10 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17e20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
17e30 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50  nt *pnPage){.  P
17e40 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
17e50 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
17e60 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
17e70 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
17e80 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17e90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
17ea0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
17eb0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
17ec0 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  de. */.  if( pPa
17ed0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
17ee0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
17ef0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
17f00 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
17f10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17f20 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  ges in the file.
17f30 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e   Store this in n
17f40 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  Page. */.  if( p
17f50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
17f60 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  id ){.    nPage 
17f70 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
17f80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
17f90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17fa0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
17fb0 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
17fc0 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20  leSize() */.    
17fd0 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
17fe0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
17ff0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65  size in bytes re
18000 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
18010 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61  Size() */..    a
18020 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
18030 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
18040 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
18050 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
18060 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28  pPager->fd) && (
18070 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
18080 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
18090 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29  ger->fd, &n))) )
180a0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
180b0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
180c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
180d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
180e0 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
180f0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
18100 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
18110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
18120 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20  Page = (Pgno)(n 
18130 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
18140 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
18150 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18160 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18170 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18180 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
18190 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
181a0 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
181b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
181c0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b  dbSizeValid = 1;
181d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
181e0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
181f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
18200 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
18210 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
18220 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
18230 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
18240 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
18250 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
18260 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
18270 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
18280 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
18290 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
182a0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
182b0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
182c0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
182d0 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
182e0 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  ut variable and 
182f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18300 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65   */.  if( pnPage
18310 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
18320 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
18330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
18350 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
18360 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
18370 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18380 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
18390 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
183a0 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
183b0 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
183c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
183d0 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
183e0 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
183f0 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
18400 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
18410 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
18420 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
18430 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
18440 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
18450 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
18460 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
18470 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
18480 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
18490 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
184a0 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
184b0 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
184c0 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
184d0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
184e0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
184f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
18500 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
18510 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
18520 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
18530 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
18540 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
18550 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
18560 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
18570 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
18580 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
18590 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
185a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
185b0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
185c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
185d0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
185e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
18610 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
18620 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
18630 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
18640 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
18650 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
18660 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
18670 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
18680 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
18690 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
186a0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
186b0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
186c0 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
186d0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
186e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
186f0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
18700 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
18710 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
18720 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
18730 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
18740 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
18750 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
18760 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  id==0 );..  /* C
18770 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
18780 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
18790 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
187a0 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
187b0 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
187c0 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ld, or one of th
187d0 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74  e transistions t
187e0 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
187f0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
18800 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
18810 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
18820 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
18830 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
18840 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
18850 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
18860 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
18870 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
18880 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
18890 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
188a0 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
188b0 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
188c0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
188d0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
188e0 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79  SERVED && lockty
188f0 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  pe==PAGER_EXCLUS
18900 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28  IVE).  );..  if(
18910 20 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 20 29 7b 0a 20 20 20 20  locktype ){.    
18930 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
18950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18960 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
18970 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
18980 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
18990 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
189a0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
189b0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
189c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
189d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
189e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
189f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18a00 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
18a10 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
18a20 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
18a30 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
18a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18a60 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
18a70 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
18a80 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
18a90 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
18aa0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
18ab0 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
18ac0 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
18ad0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
18ae0 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
18af0 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
18b00 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
18b10 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
18b20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
18b30 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
18b40 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
18b50 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
18b60 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
18b70 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
18b80 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
18b90 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
18ba0 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
18bb0 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
18bc0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
18bd0 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
18be0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
18bf0 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
18c00 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
18c10 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
18c20 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
18c30 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
18c40 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
18c50 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
18c60 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
18c70 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
18c80 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
18c90 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
18ca0 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
18cb0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
18cc0 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
18cd0 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
18ce0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
18cf0 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
18d00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
18d10 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
18d20 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
18d30 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
18d40 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
18d50 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
18d60 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
18d70 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
18d80 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
18d90 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
18da0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
18db0 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
18dc0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
18dd0 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
18de0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
18df0 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
18e00 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18e10 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
18e20 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
18e30 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
18e40 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
18e50 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
18e60 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
18e70 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
18e80 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
18e90 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
18ea0 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
18eb0 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
18ec0 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
18ed0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
18ee0 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
18ef0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
18f00 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
18f10 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
18f20 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
18f30 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
18f40 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
18f50 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
18f60 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
18f70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
18f80 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
18f90 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
18fa0 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
18fb0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
18fc0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
18fd0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
18fe0 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
18ff0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
19000 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
19010 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
19020 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
19030 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
19040 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
19050 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
19060 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
19070 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
19080 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
19090 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
190a0 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
190b0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
190c0 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
190d0 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
190e0 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
190f0 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
19100 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
19110 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
19120 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
19130 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
19140 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
19150 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
19160 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
19170 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19180 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
19190 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
191a0 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
191b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
191c0 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
191d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
191e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
191f0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50  RESERVED );.  pP
19200 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
19210 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
19220 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
19230 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
19240 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
19250 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
19260 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
19270 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
19280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
19290 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
192a0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
192b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
192c0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
192d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
192e0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
192f0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
19300 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
19310 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
19320 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
19330 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
19340 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
19350 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
19360 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
19370 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
19380 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
19390 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
193a0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
193b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
193c0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
193d0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
193e0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
193f0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
19400 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
19410 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
19420 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
19430 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
19440 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
19450 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
19460 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
19470 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
19480 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
19490 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
194a0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
194b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
194c0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
194d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
194e0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
194f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
19500 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19510 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19520 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
19530 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
19540 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
19550 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
19560 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
19570 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19580 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75  /* Set Pager.jou
19590 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f  rnalHdr to -1 fo
195a0 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66  r the benefit of
195b0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
195c0 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ack() .    ** ca
195d0 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  ll which may be 
195e0 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  made from within
195f0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
19600 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74  ollback(). If it
19610 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d  .    ** is not -
19620 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79  1, then the unsy
19630 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
19640 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  an open journal 
19650 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  file may.    ** 
19660 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
19670 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19680 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
19690 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
196a0 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
196b0 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
196c0 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 63  database may bec
196d0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
196e0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
196f0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b  journalHdr = -1;
19700 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
19710 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
19720 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
19730 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
19740 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
19750 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19760 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
19770 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
19780 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19790 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
197a0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
197b0 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
197c0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
197d0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
197e0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
197f0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
19800 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
19810 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
19820 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19830 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
19840 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
19850 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
19860 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
19870 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
19880 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
19890 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
198a0 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
198b0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
198c0 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
198d0 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
198e0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
198f0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
19900 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
19910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19920 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
19930 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
19940 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
19950 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19960 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
19970 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
19980 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
19990 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
199a0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
199b0 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
199c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
199d0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
199e0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
199f0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
19a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
19a10 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
19a20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
19a30 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
19a40 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
19a50 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
19a60 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
19a70 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
19a80 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
19a90 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
19aa0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
19ab0 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
19ac0 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
19ad0 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
19ae0 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
19af0 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
19b00 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
19b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
19b20 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
19b30 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68  g is not set, th
19b40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
19b50 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20   is a.** no-op. 
19b60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
19b70 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
19b80 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
19b90 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e  urnal-mode.** an
19ba0 64 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  d the device cha
19bb0 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
19bc0 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  the the file-sys
19bd0 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
19be0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
19bf0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
19c00 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
19c10 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
19c20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
19c30 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
19c40 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
19c50 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
19c60 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
19c70 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
19c80 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
19c90 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
19ca0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
19cb0 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
19cc0 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
19cd0 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
19ce0 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
19cf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
19d00 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
19d10 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
19d20 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
19d30 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
19d40 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
19d50 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
19d60 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
19d70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
19d80 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
19d90 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
19da0 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
19db0 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
19dc0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
19dd0 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
19de0 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
19df0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
19e00 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
19e10 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
19e20 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
19e30 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
19e40 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
19e50 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
19e60 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
19e70 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
19e80 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
19e90 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
19ea0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
19eb0 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
19ec0 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
19ed0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
19ee0 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
19ef0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
19f00 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54  ;.**   }.**.** T
19f10 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
19f20 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20  c flag is never 
19f30 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f  be set for tempo
19f40 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61  rary files, or a
19f50 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61  ny.** file opera
19f60 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  ting in no-sync 
19f70 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79  mode (Pager.noSy
19f80 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  nc set to non-ze
19f90 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ro)..**.** If su
19fa0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
19fb0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
19fc0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
19fd0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
19fe0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
19ff0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
1a000 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
1a010 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
1a020 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
1a030 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1a040 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1a050 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1a060 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1a070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a080 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
1a090 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
1a0a0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1a0b0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
1a0c0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1a0d0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ile );.    if( p
1a0e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1a0f0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1a100 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
1a110 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20        int rc;   
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a140 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
1a150 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
1a160 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
1a170 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a180 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
1a190 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
1a1a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1a1b0 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
1a1c0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1a1d0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
1a1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1a1f0 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
1a200 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
1a210 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
1a220 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
1a230 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1a240 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
1a250 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
1a260 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
1a270 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
1a280 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
1a290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a2a0 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
1a2b0 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
1a2c0 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
1a2d0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
1a2e0 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
1a2f0 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
1a300 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
1a310 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
1a320 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
1a330 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
1a340 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
1a350 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1a360 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
1a370 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69  ctions transacti
1a380 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
1a390 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
1a3a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
1a3b0 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
1a3c0 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
1a3d0 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
1a3e0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
1a3f0 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
1a400 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
1a410 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
1a420 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
1a430 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
1a440 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
1a450 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
1a460 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
1a470 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
1a480 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
1a490 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1a4a0 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
1a4b0 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
1a4c0 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
1a4d0 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
1a4e0 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
1a4f0 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
1a500 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
1a510 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
1a520 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
1a530 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
1a540 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
1a550 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
1a560 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
1a570 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
1a580 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1a590 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
1a5a0 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
1a5b0 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
1a5c0 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
1a5d0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1a5e0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
1a5f0 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
1a600 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
1a610 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
1a620 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
1a630 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
1a640 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1a650 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
1a660 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
1a670 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
1a680 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
1a690 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
1a6a0 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
1a6b0 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
1a6c0 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
1a6d0 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
1a6e0 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
1a6f0 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
1a700 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
1a710 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
1a720 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
1a730 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
1a740 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
1a750 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
1a760 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
1a770 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
1a780 38 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b  8];..u8 zHeader[
1a790 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1a7a0 61 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63  agic)+4];...memc
1a7b0 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
1a7c0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
1a7d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1a7e0 29 3b 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a  );..put32bits(&z
1a7f0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
1a800 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
1a810 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
1a820 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
1a830 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
1a840 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
1a850 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1a860 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1a870 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
1a880 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
1a890 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
1a8a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a8b0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
1a8c0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
1a8d0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
1a8e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1a8f0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
1a900 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1a910 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1a920 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
1a930 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
1a940 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
1a950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1a960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a970 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1a980 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1a990 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1a9a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1a9b0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
1a9c0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
1a9d0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
1a9e0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
1a9f0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
1aa00 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
1aa10 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
1aa20 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
1aa30 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
1aa40 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
1aa50 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
1aa60 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
1aa70 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
1aa80 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
1aa90 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
1aaa0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
1aab0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
1aac0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1aad0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1aae0 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
1aaf0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
1ab00 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
1ab10 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
1ab20 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
1ab30 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
1ab40 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1ab50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
1ab60 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
1ab70 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
1ab80 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
1ab90 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
1aba0 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
1abb0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
1abc0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
1abd0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
1abe0 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
1abf0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
1ac00 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
1ac10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ac20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
1ac30 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
1ac40 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1ac50 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1ac60 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1ac70 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1ac80 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1ac90 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1aca0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1acb0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
1acc0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
1acd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ace0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1acf0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1ad00 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
1ad10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ad20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1ad30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ad40 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
1ad50 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
1ad60 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
1ad70 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
1ad80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ad90 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
1ada0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
1adb0 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
1adc0 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
1add0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29  r->journalHdr..)
1ade0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1adf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1ae00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ae10 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1ae20 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1ae30 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1ae40 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1ae50 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1ae60 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1ae70 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1ae80 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1ae90 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1aea0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1aeb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1aec0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1aed0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1aee0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1aef0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1af00 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1af10 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1af20 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1af30 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1af40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1af50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1af60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1af70 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1af80 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1af90 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1afa0 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1afb0 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1afc0 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1afd0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1afe0 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1aff0 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1b000 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1b010 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1b020 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1b030 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ed = 1;.    sqli
1b040 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
1b050 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
1b060 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
1b070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b080 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1b090 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1b0a0 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
1b0b0 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
1b0c0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
1b0d0 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
1b0e0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
1b0f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
1b100 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
1b110 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
1b120 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
1b130 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
1b140 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
1b150 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
1b160 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
1b170 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
1b180 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1b190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1b1a0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
1b1b0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
1b1c0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
1b1d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1b1e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1b1f0 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
1b200 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
1b210 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
1b220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
1b230 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
1b240 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
1b250 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
1b260 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
1b270 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
1b280 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b290 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
1b2a0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1b2b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b2c0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
1b2d0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
1b2e0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
1b2f0 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
1b300 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
1b310 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
1b320 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
1b330 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
1b340 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
1b350 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
1b360 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
1b370 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
1b380 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
1b390 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
1b3a0 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
1b3b0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
1b3c0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
1b3d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
1b3e0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
1b3f0 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
1b400 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
1b410 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
1b420 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
1b430 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
1b440 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1b450 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b460 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
1b470 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
1b480 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1b490 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
1b4a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
1b4b0 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
1b4c0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
1b4d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1b4e0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
1b4f0 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
1b500 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
1b510 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
1b520 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
1b530 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
1b540 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
1b550 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
1b560 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
1b570 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
1b580 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
1b590 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1b5a0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
1b5b0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
1b5c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1b5d0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
1b5e0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1b5f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
1b600 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
1b610 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
1b620 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
1b630 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
1b640 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b650 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1b660 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
1b670 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
1b680 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
1b690 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1b6c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b6f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
1b700 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d  if( NEVER(pList=
1b710 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0) ) return SQL
1b720 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
1b730 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
1b740 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
1b750 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
1b760 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
1b770 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
1b780 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
1b790 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1b7a0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
1b7b0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
1b7c0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
1b7d0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
1b7e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1b7f0 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
1b800 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
1b810 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
1b820 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
1b830 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
1b840 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
1b850 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
1b860 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
1b870 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
1b880 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
1b890 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
1b8a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b8b0 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
1b8c0 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
1b8d0 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
1b8e0 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
1b8f0 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
1b900 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
1b910 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
1b920 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
1b930 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
1b940 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
1b950 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
1b960 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
1b970 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
1b980 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
1b990 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
1b9a0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
1b9b0 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
1b9c0 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
1b9d0 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
1b9e0 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
1b9f0 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
1ba00 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1ba10 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
1ba20 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
1ba30 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
1ba40 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1ba50 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
1ba60 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
1ba70 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
1ba80 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1ba90 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
1baa0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1bab0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1bac0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72  _RESERVED );.  r
1bad0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1bae0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1baf0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1bb00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
1bb10 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
1bb20 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1bb30 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1bb40 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
1bb50 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
1bb60 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
1bb70 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1bb80 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
1bb90 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
1bba0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
1bbb0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
1bbc0 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
1bbd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
1bbe0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1bbf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1bc00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1bc10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1bc20 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
1bc30 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
1bc40 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
1bc50 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
1bc60 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
1bc70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bc80 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
1bc90 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
1bca0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
1bcb0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
1bcc0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
1bcd0 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
1bce0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1bcf0 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
1bd00 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
1bd10 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
1bd20 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1bd30 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
1bd40 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
1bd50 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
1bd60 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
1bd70 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
1bd80 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
1bd90 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
1bda0 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
1bdb0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1bdc0 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
1bdd0 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
1bde0 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
1bdf0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
1be00 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
1be10 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
1be20 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
1be30 20 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 63    Note that if c
1be40 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 20  ompiled with.   
1be50 20 2a 2a 20 53 51 4c 49 54 45 5f 53 45 43 55 52   ** SQLITE_SECUR
1be60 45 5f 44 45 4c 45 54 45 20 74 68 65 20 50 47 48  E_DELETE the PGH
1be70 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 62 69  DR_DONT_WRITE bi
1be80 74 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 61  t is never set a
1be90 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 65  nd so.    ** the
1bea0 20 73 65 63 6f 6e 64 20 74 65 73 74 20 69 73 20   second test is 
1beb0 61 6c 77 61 79 73 20 74 72 75 65 2e 0a 20 20 20  always true..   
1bec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
1bed0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
1bee0 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
1bef0 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
1bf00 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
1bf10 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
1bf20 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1bf30 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
1bf40 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
1bf50 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
1bf60 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1bf90 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
1bfa0 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f   ..      /* Enco
1bfb0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
1bfc0 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
1bfd0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1bfe0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
1bff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1c000 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  EM, pData);..   
1c010 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
1c020 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
1c030 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1c040 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1c050 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
1c060 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1c070 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
1c080 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
1c090 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
1c0a0 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
1c0b0 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
1c0c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
1c0d0 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
1c0e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c0f0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
1c100 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
1c110 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
1c120 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1c130 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
1c140 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
1c150 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
1c160 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
1c170 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1c180 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
1c190 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
1c1a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c1b0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
1c1c0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
1c1d0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
1c1e0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1c1f0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
1c200 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
1c210 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
1c220 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
1c230 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
1c240 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
1c250 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
1c260 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1c270 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1c280 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
1c290 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
1c2a0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c2b0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
1c2c0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1c2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c2e0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1c2f0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1c300 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c310 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1c320 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
1c330 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1c340 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
1c350 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1c360 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
1c370 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1c380 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
1c390 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  te);.    }else{.
1c3a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c3b0 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
1c3c0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1c3d0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
1c3e0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
1c3f0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1c400 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
1c410 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1c420 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
1c430 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
1c440 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1c450 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
1c470 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
1c480 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1c490 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
1c4a0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c4b0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  . .** It is the 
1c4c0 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
1c4d0 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75  bility to use su
1c4e0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
1c4f0 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68   to check .** th
1c500 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  at it is really 
1c510 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1c520 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1c530 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1c540 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1c550 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
1c560 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
1c570 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
1c580 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
1c590 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
1c5a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c5b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c5c0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
1c5d0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1c5e0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1c5f0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
1c600 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
1c610 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
1c620 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c630 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
1c640 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
1c650 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
1c660 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
1c670 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
1c680 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
1c690 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
1c6a0 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
1c6b0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1c6c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1c6d0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1c6e0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
1c6f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c700 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  sjfd) ){.    voi
1c710 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
1c720 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f  pData;.    i64 o
1c730 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
1c740 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
1c750 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1c760 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
1c770 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67  .    CODEC2(pPag
1c780 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1c790 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
1c7a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
1c7b0 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52  ata2);.    PAGER
1c7c0 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
1c7d0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1c7e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c7f0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
1c800 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28  ;.  .    assert(
1c810 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
1c820 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
1c830 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
1c840 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ize );.    rc = 
1c850 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1c860 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
1c870 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1c8a0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1c8b0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
1c8c0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1c8d0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
1c8e0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  4);.    }.  }.  
1c8f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c900 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
1c910 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
1c920 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c930 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
1c940 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
1c950 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
1c960 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1c970 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c980 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
1c990 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c9a0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
1c9b0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
1c9c0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
1c9d0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
1c9e0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
1c9f0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1ca00 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
1ca10 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
1ca20 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
1ca30 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
1ca40 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
1ca50 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
1ca60 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
1ca70 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1ca80 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
1ca90 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
1caa0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
1cab0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
1cac0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1cad0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
1cae0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
1caf0 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
1cb00 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
1cb10 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
1cb20 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
1cb30 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
1cb40 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
1cb50 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
1cb60 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
1cb70 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
1cb80 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
1cb90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
1cba0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
1cbb0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
1cbc0 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
1cbd0 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
1cbe0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1cbf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1cc00 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
1cc10 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
1cc20 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1cc30 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1cc40 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
1cc50 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
1cc60 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
1cc70 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
1cc80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1cc90 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
1cca0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
1ccb0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
1ccc0 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
1ccd0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1cce0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
1ccf0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
1cd00 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
1cd10 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
1cd20 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
1cd30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1cd40 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
1cd50 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
1cd60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cd70 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
1cd80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cd90 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
1cda0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
1cdb0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1cdc0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1cdd0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
1cde0 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  The doNotSync fl
1cdf0 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65  ag is set by the
1ce00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ce10 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68  te() function wh
1ce20 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a  ile it.  ** is j
1ce30 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74  ournalling a set
1ce40 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
1ce50 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74  database pages t
1ce60 68 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20  hat are stored. 
1ce70 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20   ** on the same 
1ce80 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e  disk sector. Syn
1ce90 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cing the journal
1cea0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1ceb0 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20  while.  ** this 
1cec0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20  is happening as 
1ced0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
1cee0 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73  that all members
1cef0 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20   of such a.  ** 
1cf00 73 65 74 20 6f 66 20 70 61 67 65 73 20 61 72 65  set of pages are
1cf10 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
1cf20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66  together. So, if
1cf30 20 74 68 65 20 70 61 67 65 20 74 68 69 73 20 66   the page this f
1cf40 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
1cf50 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63  trying to make c
1cf60 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72  lean will requir
1cf70 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  e a journal sync
1cf80 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79   and the doNotSy
1cf90 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  nc.  ** flag is 
1cfa0 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68  set, return with
1cfb0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
1cfc0 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c  ng. The pcache l
1cfd0 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a  ayer will.  ** j
1cfe0 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61  ust have to go a
1cff0 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74  head and allocat
1d000 65 20 61 20 6e 65 77 20 70 61 67 65 20 62 75 66  e a new page buf
1d010 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  fer instead of. 
1d020 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e   ** reusing pPg.
1d030 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c  .  **.  ** Simil
1d040 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67  arly, if the pag
1d050 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
1d060 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
1d070 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20   state, do not. 
1d080 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65   ** try to write
1d090 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1d0a0 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20   pPg to disk..  
1d0b0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
1d0c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a  Pager->errCode).
1d0d0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64     || (pPager->d
1d0e0 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d  oNotSync && pPg-
1d0f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1d100 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20 20 20  D_SYNC).  ){.   
1d110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d120 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e  K;.  }..  /* Syn
1d130 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1d140 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
1d150 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
1d160 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d170 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  YNC ){.    rc = 
1d180 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1d190 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1d1a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1d1b0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1d1c0 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65  & .      !(pPage
1d1d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1d1e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1d1f0 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
1d200 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
1d210 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1d220 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
1d230 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1d240 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b  E_APPEND).    ){
1d250 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1d260 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Rec = 0;.      r
1d270 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1d280 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1d290 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1d2a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1d2b0 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
1d2c0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1d2d0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1d2e0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1d2f0 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
1d300 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
1d310 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
1d320 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73  urnal..  ** This
1d330 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1d340 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
1d350 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
1d360 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
1d370 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
1d380 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
1d390 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1d3a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69  .  **.  ** Consi
1d3b0 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1d3c0 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
1d3d0 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents:.  **.  ** 
1d3e0 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
1d3f0 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
1d400 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  X>.  **     <mod
1d410 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  ify page X>.  **
1d420 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
1d430 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  p;.  **       <s
1d440 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
1d450 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
1d460 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
1d470 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
1d480 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
1d490 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a   TO sp;.  **.  *
1d4a0 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
1d4b0 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
1d4c0 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
1d4d0 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
1d4e0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20  ritten.  ** out 
1d4f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d500 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
1d510 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
1d520 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
1d530 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
1d540 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
1d550 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
1d560 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
1d570 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74  ll read.  ** dat
1d580 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1d590 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
1d5a0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
1d5b0 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
1d5c0 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
1d5d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1d5e0 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
1d5f0 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
1d600 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61  OINT sp".  ** wa
1d610 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
1d620 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  .  ** The soluti
1d630 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1d640 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1d650 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1d660 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
1d670 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
1d680 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1d690 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
1d6a0 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a  that it will.  *
1d6b0 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
1d6c0 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
1d6d0 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
1d6e0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
1d6f0 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a  .  ** executed..
1d700 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
1d710 28 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49  (.      rc==SQLI
1d720 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
1d730 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
1d740 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
1d750 73 50 61 67 65 28 70 50 67 29 0a 20 20 29 20 29  sPage(pPg).  ) )
1d760 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
1d770 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1d780 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1d790 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d7a0 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1d7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d7c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1d7d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d7e0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1d7f0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1d800 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1d810 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
1d820 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1d830 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
1d840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d850 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
1d860 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
1d870 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1d880 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1d890 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
1d8a0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1d8b0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
1d8c0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1d8d0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1d8e0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
1d8f0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1d900 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
1d910 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
1d920 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
1d930 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
1d940 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
1d950 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
1d960 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
1d970 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1d980 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
1d990 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1d9a0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
1d9b0 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
1d9c0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
1d9d0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
1d9e0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
1d9f0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
1da00 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1da10 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
1da20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
1da30 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
1da40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
1da50 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
1da60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1da70 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
1da80 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
1da90 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
1daa0 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
1dab0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
1dac0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
1dad0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
1dae0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
1daf0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1db00 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
1db10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1db20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
1db30 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
1db40 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
1db50 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1db60 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
1db70 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1db80 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1db90 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
1dba0 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
1dbb0 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
1dbc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1dbd0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
1dbe0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
1dbf0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
1dc00 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
1dc10 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
1dc20 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
1dc30 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
1dc40 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
1dc50 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
1dc60 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
1dc70 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
1dc80 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
1dc90 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
1dca0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
1dcb0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
1dcc0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
1dcd0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
1dce0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
1dcf0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
1dd00 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
1dd10 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
1dd20 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
1dd30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1dd40 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
1dd50 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
1dd60 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
1dd70 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
1dd80 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
1dd90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1dda0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
1ddb0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
1ddc0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
1ddd0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1dde0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
1ddf0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1de00 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
1de10 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
1de20 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1de30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
1de40 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
1de50 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
1de60 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
1de70 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1de80 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
1de90 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
1dea0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
1deb0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
1dec0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1ded0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
1dee0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
1def0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
1df00 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
1df10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1df20 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
1df30 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
1df40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1df50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1df60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1df70 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1df80 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
1df90 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
1dfa0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
1dfb0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
1dfc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
1dfd0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dff0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
1e000 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
1e010 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
1e020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e030 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1e040 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
1e050 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
1e060 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
1e070 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
1e080 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
1e090 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
1e0a0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
1e0b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
1e0c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e0d0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
1e0e0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
1e0f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e100 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1e110 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e120 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
1e130 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e140 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
1e150 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
1e160 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
1e170 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
1e180 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e190 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1e1a0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1e1b0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
1e1c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e1d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
1e1e0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
1e1f0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
1e200 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
1e210 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e220 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e230 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e240 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
1e250 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
1e260 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1e270 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
1e280 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1e290 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e2a0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
1e2b0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
1e2c0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
1e2d0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
1e2e0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
1e2f0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
1e300 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
1e310 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
1e320 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
1e330 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
1e340 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
1e350 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
1e360 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
1e370 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
1e380 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1e390 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
1e3a0 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
1e3b0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
1e3c0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1e3d0 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
1e3e0 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
1e3f0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1e400 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
1e410 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
1e420 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1e430 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
1e440 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
1e450 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1e460 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
1e470 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
1e480 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
1e490 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
1e4a0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
1e4b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1e4c0 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
1e4d0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
1e4e0 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
1e4f0 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
1e500 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
1e510 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
1e520 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
1e530 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
1e540 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
1e550 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
1e560 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
1e570 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1e580 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1e590 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
1e5a0 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
1e5b0 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
1e5c0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
1e5d0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1e5e0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
1e5f0 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
1e600 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1e610 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1e620 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1e630 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1e640 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1e650 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1e660 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1e670 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
1e680 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1e690 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
1e6a0 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
1e6b0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
1e6c0 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
1e6d0 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
1e6e0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
1e6f0 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
1e700 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
1e710 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
1e720 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
1e730 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
1e740 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
1e750 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
1e760 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
1e770 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
1e780 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
1e790 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1e7a0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1e7b0 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
1e7c0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
1e7d0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
1e7e0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1e7f0 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
1e800 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
1e810 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
1e820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e830 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
1e840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e850 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
1e860 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1e870 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
1e880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
1e890 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
1e8a0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
1e8b0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1e8c0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
1e8d0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
1e8e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
1e8f0 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
1e900 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
1e910 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
1e920 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
1e930 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
1e940 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
1e950 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
1e960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
1e970 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
1e980 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
1e990 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1e9a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
1e9b0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
1e9c0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
1e9d0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
1e9e0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
1e9f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
1ea00 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1ea10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1ea20 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
1ea30 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
1ea40 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
1ea50 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
1ea60 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
1ea70 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
1ea80 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
1ea90 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
1eaa0 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
1eab0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
1eac0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ead0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
1eae0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
1eaf0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
1eb00 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
1eb10 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1eb20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1eb30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eb40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1eb50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1eb60 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1eb70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1eb80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1eb90 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1eba0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
1ebb0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
1ebc0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
1ebd0 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
1ebe0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
1ebf0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1ec00 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
1ec10 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
1ec20 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
1ec30 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
1ec40 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1ec50 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
1ec80 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
1ec90 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
1ecc0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
1ecd0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1ece0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1ecf0 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
1ed00 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
1ed10 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
1ed20 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1ed30 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1ed40 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1ed50 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
1ed60 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1ed70 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
1ed80 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1ed90 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1eda0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
1edb0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
1edc0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
1edd0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
1ede0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
1edf0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1ee00 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
1ee10 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
1ee20 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1ee30 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
1ee40 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
1ee50 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
1ee60 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
1ee70 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
1ee80 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
1ee90 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
1eea0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1eeb0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
1eec0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
1eed0 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
1eee0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1eef0 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
1ef00 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
1ef10 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
1ef20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
1ef30 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
1ef40 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1ef50 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1ef60 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1ef70 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
1ef80 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
1ef90 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1efa0 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
1efb0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
1efc0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
1efd0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
1efe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1eff0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
1f000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f010 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
1f020 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
1f030 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
1f040 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1f050 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
1f060 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
1f070 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
1f080 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
1f090 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1f0a0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f0b0 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
1f0c0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
1f0d0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f0e0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f0f0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
1f100 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
1f110 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
1f120 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1f130 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
1f140 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f150 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
1f160 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
1f170 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
1f180 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f190 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
1f1a0 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
1f1b0 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f1c0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f1d0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f1e0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f1f0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f200 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f210 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f220 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f230 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f240 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f250 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f260 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f270 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1f280 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1f290 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1f2a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f2b0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1f2c0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1f2d0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1f2e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1f2f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
1f300 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
1f310 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
1f320 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f330 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
1f340 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
1f350 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
1f360 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
1f370 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
1f380 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
1f390 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1f3a0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1f3b0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
1f3c0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
1f3d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f3e0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
1f3f0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
1f400 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
1f410 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1f420 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1f430 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
1f440 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
1f450 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
1f460 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
1f470 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1f480 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
1f490 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
1f4a0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
1f4b0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1f4c0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
1f4d0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
1f4e0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
1f4f0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
1f500 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1f510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1f520 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1f530 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
1f540 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
1f550 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
1f560 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f570 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
1f580 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
1f590 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
1f5a0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1f5b0 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
1f5c0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
1f5d0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
1f5e0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
1f5f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1f600 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
1f610 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
1f620 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1f630 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1f640 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
1f650 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
1f660 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f670 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
1f680 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
1f690 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
1f6a0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
1f6b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
1f6c0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
1f6d0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f6e0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
1f6f0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
1f700 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f710 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
1f720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f730 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
1f740 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
1f750 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
1f760 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
1f770 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f780 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1f790 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1f7a0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1f7b0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1f7c0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1f7d0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
1f7e0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
1f7f0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1f800 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
1f810 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
1f820 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1f830 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
1f840 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
1f850 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1f860 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
1f870 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
1f880 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
1f890 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
1f8a0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f8b0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
1f8c0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
1f8d0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
1f8e0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
1f8f0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
1f900 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f910 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
1f920 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1f930 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1f940 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1f950 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
1f960 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
1f970 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
1f980 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
1f990 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
1f9a0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
1f9b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
1f9c0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
1f9d0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
1f9e0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
1f9f0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
1fa00 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
1fa10 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
1fa20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
1fa30 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
1fa40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1fa50 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
1fa60 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
1fa70 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
1fa80 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
1fa90 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
1faa0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
1fab0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
1fac0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
1fad0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
1fae0 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
1faf0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
1fb00 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1fb10 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1fb20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
1fb30 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
1fb40 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
1fb50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1fb60 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
1fb70 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
1fb80 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
1fb90 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
1fba0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
1fbb0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
1fbc0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
1fbd0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
1fbe0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1fbf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1fc00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
1fc10 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
1fc20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
1fc30 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
1fc40 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
1fc50 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1fc60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1fc80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
1fc90 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
1fca0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
1fcb0 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
1fcc0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1fcd0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
1fce0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
1fcf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fd00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1fd10 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
1fd20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
1fd30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
1fd40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1fd50 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
1fd60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1fd70 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1fd80 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
1fd90 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
1fda0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
1fdb0 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
1fdc0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
1fdd0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
1fde0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
1fdf0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
1fe10 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
1fe20 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
1fe30 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
1fe40 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
1fe50 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
1fe60 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
1fe70 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
1fe80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1fe90 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1fea0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
1feb0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
1fec0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
1fed0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1fee0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
1fef0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
1ff00 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
1ff10 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
1ff20 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
1ff30 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
1ff40 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
1ff50 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1ff60 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
1ff70 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
1ff80 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1ff90 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
1ffa0 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
1ffb0 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
1ffc0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
1ffd0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
1ffe0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
1fff0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
20000 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
20010 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
20020 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
20030 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
20040 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
20050 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20060 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
20070 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
20080 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
20090 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
200a0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
200b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
200c0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
200d0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
200e0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
200f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
20100 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
20110 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
20120 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
20130 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
20140 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
20150 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
20160 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
20170 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
20180 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
20190 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
201a0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
201b0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
201c0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
201d0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
201e0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
201f0 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
20200 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20210 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65  c = 0; */.  asse
20220 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
20230 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
20240 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
20250 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
20260 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
20270 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
20280 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
20290 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
202a0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
202b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
202c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
202d0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
202e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
202f0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
20300 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
20310 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20320 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
20330 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
20340 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
20350 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
20360 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
20370 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
20380 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20390 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
203a0 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
203b0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
203c0 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
203d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
203e0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
203f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
20400 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
20410 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
20420 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20430 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
20440 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
20450 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
20460 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
20470 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20480 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
20490 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
204a0 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
204b0 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
204c0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
204d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
204e0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
204f0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
20500 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
20510 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
20520 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20530 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
20540 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
20550 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
20560 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
20570 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
20580 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
20590 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
205a0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
205b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
205c0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
205d0 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
205e0 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
205f0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
20600 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
20610 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
20620 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
20630 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
20640 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
20650 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
20660 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
20670 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20680 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
20690 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
206a0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
206b0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
206c0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
206d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
206e0 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
206f0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
20700 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
20710 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
20720 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
20730 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
20740 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
20750 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
20760 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
20770 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
20780 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
20790 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
207a0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
207b0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
207c0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
207d0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
207e0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
207f0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
20800 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
20810 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
20820 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
20830 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
20840 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
20850 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
20860 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
20870 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
20880 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
20890 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
208a0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
208b0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
208c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
208d0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
208e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
208f0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
20900 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
20910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
20920 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
20930 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
20940 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
20950 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
20960 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
20970 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
20980 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
20990 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
209a0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
209b0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
209c0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
209d0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
209e0 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
209f0 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
20a00 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
20a10 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
20a20 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
20a30 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
20a40 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
20a50 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
20a60 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
20a70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
20a80 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
20a90 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
20aa0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
20ab0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
20ac0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
20ad0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
20ae0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
20af0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
20b00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
20b10 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
20b20 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
20b30 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
20b40 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
20b50 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
20b60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
20b70 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
20b80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
20b90 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
20ba0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
20bb0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
20bc0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
20bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20be0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
20bf0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
20c00 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  exists;         
20c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20c20 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
20c30 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
20c40 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
20c50 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
20c60 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
20c70 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
20c80 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20c90 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
20ca0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
20cb0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
20cc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20cd0 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
20ce0 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73  RED );..  *pExis
20cf0 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  ts = 0;.  rc = s
20d00 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
20d10 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
20d20 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
20d30 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
20d40 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  ists);.  if( rc=
20d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
20d60 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
20d70 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20  locked;         
20d80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20d90 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
20da0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
20db0 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
20dc0 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
20dd0 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
20de0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
20df0 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
20e00 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
20e10 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
20e20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
20e30 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
20e40 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
20e50 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
20e60 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
20e70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
20e80 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
20e90 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
20ea0 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
20eb0 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
20ec0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
20ed0 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
20ee0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
20ef0 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
20f00 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
20f10 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
20f20 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
20f30 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
20f40 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
20f50 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
20f60 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
20f70 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
20f80 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
20f90 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
20fa0 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
20fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
20fc0 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
20fd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
20fe0 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
20ff0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
21000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
21010 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ked ){.      int
21020 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f   nPage;..      /
21030 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65  * Check the size
21040 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21050 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e   file. If it con
21060 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73  sists of 0 pages
21070 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
21080 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
21090 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65  al file. See the
210a0 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
210b0 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20  above for .     
210c0 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e   ** the reasonin
210d0 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20  g here.  Delete 
210e0 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75  the obsolete jou
210f0 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a  rnal file under.
21100 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52        ** a RESER
21110 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69  VED lock to avoi
21120 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  d race condition
21130 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76  s and to avoid v
21140 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a  iolating.      *
21150 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20  * [H33020]..    
21160 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
21170 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
21180 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
21190 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
211a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
211b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  {.        if( nP
211c0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
211d0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
211e0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
211f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21200 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
21210 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
21220 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
21230 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21240 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
21250 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
21260 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
21270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21280 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
21290 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
212a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
212b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
212c0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
212d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
212e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
212f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21300 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
21310 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
21320 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
21330 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
21340 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
21350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21360 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
21370 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
21380 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
21390 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
213a0 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
213b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
213c0 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
213d0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
213e0 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
213f0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
21400 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
21410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21420 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
21430 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21440 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
21450 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
21460 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
21470 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
21480 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21490 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
214a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
214b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
214c0 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
214d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
214e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
214f0 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
21500 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21510 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
21520 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
21530 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
21540 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
21560 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
21570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
215a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
215b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
215c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
215d0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
215e0 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
215f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
21600 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
21610 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
21620 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
21630 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
21640 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
21650 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
21660 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
21670 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72  ** its has a zer
21680 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
21690 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
216a0 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
216b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
216c0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
216d0 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
216e0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
216f0 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
21700 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
21710 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
21720 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
21730 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
21740 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
21750 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
21760 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
21770 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
21780 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
21790 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
217a0 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
217b0 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
217c0 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
217d0 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
217e0 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
217f0 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
21800 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
21810 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
21820 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
21830 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
21840 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
21850 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
21860 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
21870 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
21880 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21890 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
218a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
218b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
218c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
218d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
218e0 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
218f0 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
21900 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
21910 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
21920 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
21930 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
21940 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
21950 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
21960 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
21970 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
21980 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
21990 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
219a0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
219b0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
219c0 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
219d0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
219e0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
219f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
21a00 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
21a10 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
21a20 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
21a30 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
21a40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
21a50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21a60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
21a70 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
21a80 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
21a90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
21aa0 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
21ab0 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
21ac0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
21ad0 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
21ae0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
21af0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
21b00 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
21b10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21b40 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20    i64 iOffset;  
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b60 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
21b70 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72   file to read fr
21b80 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  om */..  assert(
21b90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
21ba0 50 41 47 45 52 5f 53 48 41 52 45 44 20 26 26 20  PAGER_SHARED && 
21bb0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
21bc0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
21bd0 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28  r->fd) );..  if(
21be0 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70   NEVER(!isOpen(p
21bf0 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20  Pager->fd)) ){. 
21c00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21c10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
21c20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
21c30 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
21c40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21c60 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20  ;.  }.  iOffset 
21c70 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
21c80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21c90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21ca0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
21cb0 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
21cc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21cd0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
21ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
21cf0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
21d00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21d10 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  OK;.  }.  if( pg
21d20 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38 20  no==1 ){.    u8 
21d30 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
21d40 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
21d50 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [24];.    memcpy
21d60 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
21d70 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
21d80 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
21d90 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
21da0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
21db0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
21dc0 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
21dd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
21de0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
21df0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
21e00 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
21e10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
21e20 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
21e30 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
21e40 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
21e50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
21e60 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
21e70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
21e90 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
21ea0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
21eb0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
21ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21ed0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21ee0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
21ef0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
21f00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21f10 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
21f20 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
21f30 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
21f40 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
21f50 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
21f60 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
21f70 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
21f80 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
21f90 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
21fa0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
21fb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
21fc0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
21fd0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
21fe0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
21ff0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
22000 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
22010 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
22020 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
22030 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
22040 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
22050 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
22060 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
22070 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
22080 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
22090 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
220a0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
220b0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
220c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
220d0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
220e0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
220f0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
22100 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
22110 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
22120 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
22130 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
22140 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
22150 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
22160 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
22170 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
22180 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
22190 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
221a0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
221b0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
221c0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
221d0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
221e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
221f0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
22200 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
22210 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
22220 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
22230 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
22240 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
22250 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
22260 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
22270 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
22280 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
22290 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
222a0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
222b0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
222c0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
222d0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
222e0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
222f0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
22300 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
22310 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
22320 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
22330 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
22340 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
22350 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
22360 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
22370 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
22380 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
22390 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
223a0 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
223b0 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
223c0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
223d0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
223e0 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
223f0 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
22400 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
22410 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
22420 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
22430 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
22440 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
22450 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
22460 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
22470 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
22480 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
22490 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
224a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
224b0 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
224c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
224d0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
224e0 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
224f0 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
22500 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
22510 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
22520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
22530 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
22540 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
22550 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22560 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
22570 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
22580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
225b0 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
225c0 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
225d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
225e0 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
225f0 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
22600 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
22610 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
22620 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
22630 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
22640 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
22650 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
22660 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
22670 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
22680 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22690 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  che)==0 );.  if(
226a0 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
226b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
226c0 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
226d0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
226e0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
226f0 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72  base is in an er
22700 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
22710 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
22720 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
22730 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
22740 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22750 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
22760 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e  rollback.  ** an
22770 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e  y hot journal in
22780 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
22790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
227a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
227b0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
227c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
227d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
227e0 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
227f0 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
22800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
22810 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
22820 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
22830 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
22840 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
22850 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
22860 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65  K || isErrorRese
22870 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
22880 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
22890 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
228a0 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a  ;.    int isHotJ
228b0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
228c0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
228d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
228e0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
228f0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22900 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  che)==0 );.    i
22910 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  f( pPager->noRea
22920 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61  dlock ){.      a
22930 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72  ssert( pPager->r
22940 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20  eadOnly );.     
22950 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22960 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
22970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22980 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
22990 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
229a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
229b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
229c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
229d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
229e0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
229f0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
22a00 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
22a10 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
22a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22a40 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
22a50 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  LOCK );..    /* 
22a60 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
22a70 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
22a80 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
22a90 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
22aa0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
22ab0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
22ac0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
22ad0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
22ae0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
22af0 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
22b00 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73  eset ){.      as
22b10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
22b20 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
22b30 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20  RED );.      rc 
22b40 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
22b50 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f  pPager, &isHotJo
22b60 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
22b70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22b80 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
22b90 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
22ba0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
22bb0 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73  ErrorReset || is
22bc0 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
22bd0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
22be0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
22bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22c00 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
22c10 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
22c20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
22c30 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
22c40 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
22c50 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
22c60 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
22c70 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
22c80 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
22c90 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
22ca0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
22cb0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
22cc0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
22cd0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
22ce0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
22cf0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
22d00 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
22d10 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
22d20 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
22d30 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
22d40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
22d50 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
22d60 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
22d70 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
22d80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
22d90 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
22da0 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
22db0 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
22dc0 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
22dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22de0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
22df0 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
22e00 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
22e10 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
22e20 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
22e30 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
22e40 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
22e50 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
22e60 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
22e70 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
22e80 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
22e90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22ea0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
22eb0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
22ec0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22ed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22ee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
22ef0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22f00 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
22f10 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
22f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22f30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22f40 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
22f50 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
22f60 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
22f70 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
22f80 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
22f90 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
22fa0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
22fb0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
22fc0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22fd0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
22fe0 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
22ff0 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
23000 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
23010 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
23020 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
23030 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
23040 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
23050 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
23060 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
23070 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
23080 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
23090 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
230a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
230b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
230c0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
230d0 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
230e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
230f0 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
23100 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
23110 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
23120 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
23130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
23150 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
23160 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
23170 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
23180 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
23190 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
231a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
231b0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
231c0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
231d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
231e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
231f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
23200 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
23210 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
23220 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
23230 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23240 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
23250 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
23260 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
23270 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23280 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
23290 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
232a0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
232b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
232c0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
232d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
232e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
232f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
23300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23320 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
23330 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
23340 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
23350 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
23360 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23370 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
23380 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
23390 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
233a0 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
233b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
233c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
233d0 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
233e0 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
233f0 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  , it .          
23400 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
23410 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
23420 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
23430 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
23440 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
23450 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
23460 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
23470 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
23480 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  xist.  */.      
23490 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
234a0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
234b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
234c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
234d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
234e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
234f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
23500 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
23510 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   }..      /* TOD
23520 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65  O: Why are these
23530 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49   cleared here? I
23540 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20  s it necessary? 
23550 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
23560 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
23570 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
23580 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
23590 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
235a0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
235b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
235c0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
235d0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
235e0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
235f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
23600 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
23610 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
23620 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
23630 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
23640 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
23650 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
23660 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
23670 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
23680 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
23690 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
236a0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
236b0 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f   cache..      */
236c0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
236d0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
236e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
236f0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
23700 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
23710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23730 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
23740 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
23750 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
23760 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
23770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
23780 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
23790 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
237a0 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ED).           |
237b0 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
237c0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
237d0 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
237e0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
237f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23800 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
23810 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
23820 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
23830 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a  ->pPCache)>0 ){.
23840 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
23850 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
23860 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
23870 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23880 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
23890 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
238a0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
238b0 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
238c0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
238d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
238e0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
238f0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
23900 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
23910 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
23920 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
23930 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
23940 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
23950 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
23960 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23970 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
23980 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
23990 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
239a0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
239b0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
239c0 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
239d0 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
239e0 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
239f0 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
23a00 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
23a10 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
23a20 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
23a30 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
23a40 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
23a50 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
23a60 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
23a70 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
23a80 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
23a90 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
23aa0 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
23ab0 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
23ac0 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
23ad0 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
23ae0 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
23af0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
23b00 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
23b10 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
23b20 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
23b30 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
23b40 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
23b50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
23b60 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
23b70 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
23b80 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20  FileVers)];.    
23b90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
23ba0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
23bb0 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  0);..      if( p
23bc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
23bd0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
23be0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
23bf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23c00 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
23c10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23c20 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
23c30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
23c40 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
23c50 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
23c60 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
23c70 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
23c80 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
23c90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
23ca0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
23cb0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
23cc0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
23cd0 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
23ce0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
23cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23d00 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
23d10 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
23d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23d30 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
23d40 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
23d50 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
23d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
23d70 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
23d80 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
23d90 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
23da0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
23db0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
23dc0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
23dd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23df0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
23e00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
23e10 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
23e20 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
23e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23e40 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  K ){.    /* page
23e50 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20  r_unlock() is a 
23e60 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73  no-op for exclus
23e70 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d  ive mode and in-
23e80 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
23e90 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75  . */.    pager_u
23ea0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
23eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
23ed0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
23ee0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
23ef0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
23f00 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
23f10 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
23f20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
23f30 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
23f40 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
23f50 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
23f60 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
23f70 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
23f80 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
23f90 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
23fa0 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
23fb0 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
23fc0 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
23fd0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
23fe0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
23ff0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
24000 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
24010 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
24020 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
24030 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
24040 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26  Cache)==0).   &&
24050 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
24060 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
24070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
24080 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65  ) .  ){.    page
24090 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
240a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
240b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
240c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
240d0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
240e0 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
240f0 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
24100 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
24110 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
24120 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
24130 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
24140 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
24150 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
24160 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
24170 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24180 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
24190 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
241a0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
241b0 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
241c0 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
241d0 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
241e0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
241f0 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
24200 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
24210 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
24220 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
24230 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
24240 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
24250 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
24260 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
24270 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
24280 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
24290 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
242a0 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
242b0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
242c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
242d0 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
242e0 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
242f0 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
24300 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
24310 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
24320 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
24330 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
24340 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
24350 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
24360 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
24370 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24380 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
24390 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
243a0 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
243b0 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
243c0 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
243d0 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
243e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
243f0 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
24400 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
24410 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
24420 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
24430 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
24440 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
24450 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
24460 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
24470 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
24480 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
24490 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
244a0 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
244b0 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
244c0 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
244d0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
244e0 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
244f0 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
24500 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
24510 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
24520 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
24530 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
24540 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
24550 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
24560 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
24570 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63   two seperate sc
24580 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
24590 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
245a0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
245b0 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
245c0 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
245d0 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
245e0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
245f0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
24600 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
24610 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
24620 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
24630 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65  ache to populate
24640 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
24650 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
24660 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
24670 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
24680 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
24690 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
246a0 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
246b0 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
246c0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
246d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
246e0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
246f0 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
24700 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
24710 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
24720 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
24730 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
24740 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
24750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
24760 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
24770 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
24780 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
24790 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
247a0 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
247b0 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
247c0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
247d0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
247e0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
247f0 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
24800 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
24810 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
24820 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
24830 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
24840 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
24850 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
24860 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
24870 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
24880 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
24890 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
248a0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
248b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
248c0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
248d0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
248e0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
248f0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
24900 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
24910 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
24920 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
24930 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
24940 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
24950 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
24960 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
24970 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
24980 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
24990 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
249a0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
249b0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
249c0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
249d0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
249e0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
249f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
24a00 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
24a10 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
24a20 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
24a30 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
24a40 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
24a50 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
24a60 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
24a70 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
24a80 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
24a90 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
24aa0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
24ab0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
24ac0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
24ad0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
24ae0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
24af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24b00 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
24b10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
24b20 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
24b30 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
24b40 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
24b50 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
24b60 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
24b70 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
24b80 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
24b90 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
24ba0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
24bb0 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
24bc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
24bd0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
24be0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
24bf0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
24c00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24c10 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55  r->state>PAGER_U
24c20 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
24c30 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
24c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24c50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
24c60 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
24c70 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
24c80 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
24c90 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
24ca0 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
24cb0 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
24cc0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
24cd0 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
24ce0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
24cf0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
24d00 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  OK && pPager->er
24d10 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
24d20 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  LL ){.    rc = p
24d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
24d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
24d50 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
24d60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
24d70 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70  ache, pgno, 1, p
24d80 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  pPage);.  }..  i
24d90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24da0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
24db0 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
24dc0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
24dd0 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
24de0 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
24df0 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
24e00 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
24e10 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
24e20 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
24e30 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
24e40 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
24e50 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
24e60 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
24e70 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
24e80 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
24e90 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
24ea0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
24eb0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
24ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
24ed0 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
24ee0 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
24ef0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
24f00 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
24f10 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  )->pPager ){.   
24f20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
24f30 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
24f40 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
24f50 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
24f60 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
24f70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
24f80 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
24f90 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
24fa0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
24fb0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
24fc0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
24fd0 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45  ger) );.    PAGE
24fe0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
24ff0 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Hit);.    return
25000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
25010 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
25020 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
25030 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
25040 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
25050 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
25060 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
25070 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  .  */.    int nM
25080 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49  ax;..    PAGER_I
25090 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
250a0 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
250b0 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
250c0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
250d0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
250e0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
250f0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
25100 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
25110 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
25120 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
25130 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
25140 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
25150 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
25160 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
25170 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
25180 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
25190 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
251a0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
251b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
251c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
251d0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
251e0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
251f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25200 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
25210 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
25220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25230 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
25240 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
25250 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25260 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  nMax<(int)pgno |
25270 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e  | MEMDB || noCon
25280 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tent ){.      if
25290 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
252a0 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53  xPgno ){..rc = S
252b0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74  QLITE_FULL;..got
252c0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
252d0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
252e0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
252f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
25300 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
25310 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
25320 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
25330 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
25340 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
25350 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
25360 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
25370 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
25380 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
25390 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
253a0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
253b0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
253c0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
253d0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
253e0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
253f0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
25400 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
25410 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
25420 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
25430 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
25440 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
25450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
25460 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
25470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25480 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
25490 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
254a0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
254b0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
254c0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
254d0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
254e0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
254f0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25500 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
25510 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
25520 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
25530 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
25540 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
25550 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
25560 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
25570 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
25580 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
25590 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
255a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
255b0 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
255c0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
255d0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
255e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
255f0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
25600 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
25610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25620 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
25630 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
25640 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
25650 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
25660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
25680 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
25690 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
256a0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
256b0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
256c0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
256d0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
256e0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
256f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
25700 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
25710 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
25720 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
25730 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
25740 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
25750 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
25760 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
25770 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
25780 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
25790 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
257a0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
257b0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
257c0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
257d0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
257e0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
257f0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
25800 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
25810 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25820 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
25830 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
25840 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65   cache. Also, re
25850 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a  turn 0 if the .*
25860 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  * pager is in PA
25870 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
25880 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
25890 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
258a0 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  * or if the page
258b0 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
258c0 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
258d0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
258e0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
258f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
25900 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
25910 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
25920 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
25930 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
25940 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
25950 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
25960 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
25970 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
25980 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
25990 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
259a0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
259b0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
259c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
259d0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
259e0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
259f0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
25a00 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
25a10 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
25a20 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
25a30 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
25a40 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
25a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25a60 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
25a70 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
25a80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25a90 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
25aa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25ab0 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e  state > PAGER_UN
25ac0 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  LOCK );.  sqlite
25ad0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
25ae0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
25af0 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
25b00 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
25b10 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
25b20 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
25b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
25b40 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
25b50 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
25b60 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
25b70 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
25b80 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
25b90 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
25ba0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
25bb0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
25bc0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
25bd0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
25be0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
25bf0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
25c00 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
25c10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25c20 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
25c30 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
25c40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25c50 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
25c60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
25c70 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
25c80 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
25c90 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
25ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
25cb0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
25cc0 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  le has already b
25cd0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75  een opened, ensu
25ce0 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  re that the.** s
25cf0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
25d00 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20  is open too. If 
25d10 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
25d20 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a   is not open,.**
25d30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25d40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
25d50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25d60 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
25d70 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
25d80 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a  ing to plan. .**
25d90 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   An SQLITE_IOERR
25da0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
25db0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
25dc0 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
25dd0 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69  ite3OsOpen() fai
25de0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
25df0 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
25e00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25e10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25e20 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f  TE_OK;.  if( isO
25e30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25e40 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
25e50 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
25e60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
25e70 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
25e80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
25e90 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
25ea0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
25eb0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
25ec0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
25ed0 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
25ee0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
25ef0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
25f00 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
25f10 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
25f20 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
25f30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
25f40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
25f50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25f60 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
25f70 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
25f80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
25f90 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
25fa0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
25fb0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
25fc0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
25fd0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
25fe0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25ff0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
26000 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
26010 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
26020 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
26030 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
26040 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
26050 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
26060 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
26070 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
26080 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
26090 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
260a0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
260b0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
260c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
260d0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
260e0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
260f0 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
26100 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
26110 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
26120 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
26130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
26140 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
26150 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
26160 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
26170 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
26180 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
26190 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
261a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
261b0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
261c0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
261d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
261e0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
261f0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
26200 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
26210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26220 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
26230 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
26240 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
26250 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
26260 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
26270 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
26280 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
26290 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
262a0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
262b0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
262c0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
262d0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
262e0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
262f0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
26300 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
26310 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
26320 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
26330 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
26340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26350 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
26360 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26380 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
263a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
263b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
263c0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
263d0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
263e0 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
263f0 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
26400 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26410 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
26420 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
26430 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
26440 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
26450 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
26460 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
26470 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
26480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26490 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
264a0 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
264b0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
264c0 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
264d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
264e0 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
264f0 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
26500 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
26510 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
26520 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
26530 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
26540 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
26550 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
26560 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
26570 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
26580 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  de;..  /* TODO: 
26590 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73  Is it really pos
265a0 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72  sible to get her
265b0 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c  e with dbSizeVal
265c0 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20  id==0? If not,. 
265d0 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   ** the call to 
265e0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
265f0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e   can be removed.
26600 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
26610 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
26620 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71  Valid==0 );.  sq
26630 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26640 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
26650 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
26660 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
26670 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
26680 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
26690 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
266a0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
266b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
266c0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
266d0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
266e0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
266f0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
26700 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
26710 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
26720 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
26730 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
26740 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26750 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26760 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
26770 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
26780 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
26790 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
267a0 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
267b0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
267c0 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
267d0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
267e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
267f0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
26800 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
26810 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
26820 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
26830 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
26840 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
26850 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
26860 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
26870 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
26880 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
26890 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66  ).        );.#if
268a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
268b0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
268c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
268d0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
268e0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
268f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26900 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
26910 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
26920 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
26930 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
26940 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
26950 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
26960 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
26970 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
26980 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
26990 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
269a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
269b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
269c0 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57   );.  }...  /* W
269d0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
269e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
269f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26a00 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a  e and open .  **
26a10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26a20 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
26a30 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
26a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
26a50 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
26a60 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
26a70 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
26a80 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  d. */.    pPager
26a90 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
26aa0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
26ab0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
26ac0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
26ad0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
26ae0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
26af0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
26b00 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
26b10 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
26b20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
26b30 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26b40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
26b50 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
26b60 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
26b70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
26b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
26b90 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
26ba0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  t ){.    rc = op
26bb0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
26bc0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
26bd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26be0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
26bf0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
26c00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
26c10 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
26c20 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ournal = 0;.  }.
26c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26c40 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
26c50 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
26c60 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
26c70 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
26c80 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
26c90 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
26ca0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
26cb0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
26cc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
26cd0 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
26ce0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
26cf0 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
26d00 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
26d10 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
26d20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26d30 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
26d40 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
26d50 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
26d60 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
26d70 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
26d80 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
26d90 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
26da0 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
26db0 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
26dc0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
26dd0 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
26de0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e  n-memory file an
26df0 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d, the journal f
26e00 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65  ile is .** opene
26e10 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  d if it has not 
26e20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f  been already. Fo
26e30 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  r a temporary fi
26e40 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  le, the opening 
26e50 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  .** of the journ
26e60 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
26e70 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
26e80 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65  is an actual nee
26e90 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74  d to .** write t
26ea0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  o the journal. T
26eb0 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20  ODO: Why handle 
26ec0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
26ed0 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a  differently?.**.
26ee0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
26ef0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
26f00 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c   (or if it is al
26f10 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65  ready open), the
26f20 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68  n a.** journal-h
26f30 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
26f40 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
26f50 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   it..**.** If th
26f60 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
26f70 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
26f80 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
26f90 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
26fa0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
26fb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
26fc0 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
26fd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
26fe0 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
26ff0 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
27000 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
27010 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
27020 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
27030 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
27040 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
27050 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
27060 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
27070 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
27080 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
27090 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
270a0 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
270b0 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
270c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
270d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
270e0 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
270f0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
27100 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
27110 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
27120 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
27130 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
27140 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
27150 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
27160 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
27170 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
27180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
271a0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
271b0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65  NLOCK );.  pPage
271c0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
271d0 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
271e0 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ry;.  if( pPager
271f0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
27200 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
27210 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
27220 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
27230 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
27240 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
27250 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  pFile );..    /*
27260 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
27270 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
27280 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
27290 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
272a0 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  meter.    ** is 
272b0 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
272c0 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
272d0 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
272e0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
272f0 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
27300 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
27310 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
27320 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
27330 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f  LUSIVE.    ** lo
27340 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
27350 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
27360 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
27370 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
27380 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
27390 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
273a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
273b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
273c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
273d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
273e0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28  ERVED;.      if(
273f0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
27400 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
27410 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
27420 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
27430 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
27440 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
27450 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73 20   required locks 
27460 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c 6c  were successfull
27470 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65 6e  y obtained, open
27480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
27490 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72 69   ** file and wri
274a0 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
274b0 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 69  rnal-header to i
274c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
274d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
274e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
274f0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
27500 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
27510 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
27520 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
27530 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
27540 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
27550 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
27560 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27570 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
27580 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
27590 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
275a0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
275b0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61  cess mode the la
275c0 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
275d0 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
275e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
275f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
27600 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
27610 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
27620 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
27630 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
27640 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
27650 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
27660 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20   and either was 
27670 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
27680 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64  ytes or its head
27690 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76  er was.    ** ov
276a0 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a  erwritten with z
276b0 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
276c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
276d0 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
276e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
276f0 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
27700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27710 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
27720 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
27730 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
27740 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
27750 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
27760 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
27770 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27780 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  )));.  assert( !
27790 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
277a0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
277b0 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
277c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
277d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
277e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
277f0 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  t( !pPager->dbMo
27800 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f 2a  dified );.    /*
27810 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65   Ignore any IO e
27820 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73  rror that occurs
27830 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e   within pager_en
27840 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e  d_transaction().
27850 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72 70   The.    ** purp
27860 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  ose of this call
27870 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68 65   is to reset the
27880 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
27890 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  of the pager.   
278a0 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20   ** sub-system. 
278b0 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  It doesn't matte
278c0 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r if the journal
278d0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f  -file is not pro
278e0 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69 6e  perly.    ** fin
278f0 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20 70  alized at this p
27900 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69  oint (since it i
27910 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f  s not a valid jo
27920 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61  urnal file anywa
27930 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  y)..    */.    p
27940 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
27950 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
27960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
27980 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
27990 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
279a0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
279b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
279c0 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
279d0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
279e0 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
279f0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
27a00 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
27a10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
27a20 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
27a30 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
27a40 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
27a50 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
27a60 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
27a70 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
27a80 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
27a90 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
27aa0 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
27ab0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
27ac0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
27ad0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
27ae0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
27af0 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
27b00 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
27b10 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
27b20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
27b30 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
27b40 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
27b50 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
27b60 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
27b70 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64  een.  ** started
27b80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
27b90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
27ba0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
27bb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
27bc0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65  ror has been pre
27bd0 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64  viously detected
27be0 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  , we should not 
27bf0 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20  be.  ** calling 
27c00 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 52  this routine.  R
27c10 65 70 65 61 74 20 74 68 65 20 65 72 72 6f 72 20  epeat the error 
27c20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 0a  for robustness..
27c30 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
27c40 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
27c50 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67  ) )  return pPag
27c60 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
27c70 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20  /* Higher-level 
27c80 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63  routines never c
27c90 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
27ca0 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  n if database is
27cb0 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62   not.  ** writab
27cc0 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61  le.  But check a
27cd0 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20  nyway, just for 
27ce0 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20  robustness. */. 
27cf0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
27d00 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72  r->readOnly) ) r
27d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
27d20 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  M;..  assert( !p
27d30 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
27d40 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
27d50 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
27d60 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
27d70 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
27d80 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
27d90 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
27da0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
27db0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
27dc0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
27dd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
27de0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
27df0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
27e00 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
27e10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
27e20 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61  (pPg) ){.    pPa
27e30 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
27e40 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
27e50 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
27e60 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
27e70 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
27e80 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
27e90 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
27ea0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
27eb0 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
27ec0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
27ed0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
27ee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48  .    **.    ** H
27ef0 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
27f00 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65  ines should have
27f10 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65 64   already started
27f20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
27f30 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61      ** which mea
27f40 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63 71  ns they have acq
27f50 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73 73  uired the necess
27f60 61 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6f 70  ary locks and op
27f70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 61 20 72 6f  ened.    ** a ro
27f80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
27f90 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   Double-check to
27fa0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 69 73   makes sure this
27fb0 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
27fc0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
27fd0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
27fe0 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
27ff0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
28000 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
28010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc!=SQLITE_OK) )
28020 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
28030 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
28040 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28050 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
28060 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
28070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28080 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61 73 73  OFF ){.      ass
28090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
280a0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
280b0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
280c0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
280d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
280e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
280f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28100 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
28110 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
28120 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
28130 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
28140 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
28150 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
28160 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
28170 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
28180 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
28190 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
281a0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
281b0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
281c0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
281d0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
281e0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
281f0 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
28200 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
28210 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28220 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
28230 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
28240 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
28250 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
28260 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
28270 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
28280 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
28290 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
282a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
282b0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
282c0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
282d0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
282e0 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
282f0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
28300 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
28310 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
28320 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
28330 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
28340 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
28350 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
28360 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
28370 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
28380 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
28390 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
283a0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
283b0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
283c0 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
283d0 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
283e0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
283f0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28400 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
28410 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28450 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
28460 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
28470 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
284a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
284b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
284c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
284d0 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
284e0 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
284f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28510 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
28520 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
28530 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
28540 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
28550 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
28570 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
28580 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28590 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
285a0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
285b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
285d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
285e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
285f0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
28600 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
28610 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
28620 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
28630 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
28640 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
28650 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
28660 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
28670 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
28680 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
28690 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
286a0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
286b0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
286c0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
286d0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
286e0 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
286f0 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
28700 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
28710 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
28720 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28730 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
28740 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
28750 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
28760 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
28770 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
28780 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
28790 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
287a0 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
287b0 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
287c0 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
287d0 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
287e0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
287f0 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
28800 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
28810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28820 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
28830 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
28840 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
28850 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
28860 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
28870 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
28880 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
28890 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
288a0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
288b0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
288c0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
288d0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
288e0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
288f0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
28900 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
28910 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
28920 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
28930 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
28940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
28950 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
28960 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
28970 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
28980 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
289a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
289b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
289c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
289d0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
289e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
289f0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
28a00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28a10 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
28a20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
28a30 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
28a50 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
28a60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
28a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28a80 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
28a90 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
28aa0 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
28ab0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
28ac0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
28ad0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
28b00 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
28b10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
28b20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28b40 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
28b50 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
28b60 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
28b70 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
28b80 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
28b90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
28ba0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
28bb0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
28bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28bd0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28be0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
28bf0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
28c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28c10 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
28c20 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
28c40 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
28c50 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
28c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28c70 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
28c80 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
28c90 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
28ca0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
28cb0 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
28cc0 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
28cd0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
28ce0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
28cf0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
28d00 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
28d10 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
28d20 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
28d30 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
28d40 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
28d50 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
28d60 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
28d70 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
28d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28d90 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
28da0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
28db0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
28dc0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
28dd0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
28de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
28df0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
28e00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28e10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
28e20 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
28e30 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
28e40 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
28e50 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
28e60 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
28e70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28e80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
28e90 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
28ea0 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
28eb0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
28ec0 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
28ed0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
28ee0 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
28ef0 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
28f00 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
28f10 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
28f20 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
28f30 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
28f40 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
28f50 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
28f60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
28f70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
28f80 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
28f90 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
28fa0 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
28fb0 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
28fc0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
28fd0 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
28fe0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
28ff0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
29000 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
29010 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
29020 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
29030 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
29040 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
29050 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
29060 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
29070 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
29080 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29090 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
290a0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
290b0 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
290c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
290d0 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
290e0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
290f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
29100 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
29110 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
29120 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
29130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
29140 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
29150 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
29160 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
29170 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
29180 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
29190 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
291a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
291b0 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
291c0 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
291d0 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
291e0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
291f0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
29200 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
29210 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
29220 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
29230 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
29240 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
29250 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
29260 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
29270 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
29280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29290 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
292a0 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
292b0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
292c0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
292d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
292e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
292f0 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
29300 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29310 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
29320 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
29330 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
29340 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
29350 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
29360 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
29370 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
29380 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
29390 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
293a0 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
293b0 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
293c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
293d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
293e0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
293f0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
29400 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
29410 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
29420 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
29430 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
29440 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
29450 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
29460 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
29470 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
29480 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
29490 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
294a0 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
294b0 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
294c0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
294d0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
294e0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
294f0 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
29500 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
29510 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
29520 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
29530 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
29540 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
29550 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
29560 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
29570 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
29580 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
29590 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
295a0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
295b0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
295c0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
295d0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
295e0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
295f0 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
29600 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29610 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
29620 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29630 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
29640 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
29650 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
29660 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
29670 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
29680 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
29690 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
296a0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
296b0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
296c0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
296d0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
296e0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
296f0 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
29700 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
29710 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
29720 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
29730 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
29740 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
29750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29760 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
29770 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
29780 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
297a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
297b0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
297c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
297d0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
297e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
297f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
29800 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
29810 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
29820 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
29830 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
29840 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
29850 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29860 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
29870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29880 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
29890 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
298a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
298b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
298c0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
298d0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
298e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
298f0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
29910 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29920 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
29930 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
29940 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
29950 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
29960 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
29970 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
29980 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
29990 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
299a0 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
299b0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
299c0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
299d0 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
299e0 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
299f0 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
29a00 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
29a10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
29a20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
29a30 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
29a40 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
29a50 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
29a60 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
29a70 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
29a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
29a90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
29aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
29ab0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
29ac0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29ad0 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
29ae0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  c==0 );.      fo
29af0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
29b00 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
29b10 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
29b20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
29b30 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
29b40 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
29b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
29b60 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
29b70 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
29b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29b90 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
29ba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29bb0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
29bc0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
29bd0 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
29be0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
29bf0 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
29c00 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
29c10 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
29c20 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
29c30 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
29c40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29c50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
29c60 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
29c70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
29c80 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
29c90 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
29ca0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
29cb0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
29cc0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
29cd0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
29ce0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
29cf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
29d00 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
29d10 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
29d20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29d30 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
29d40 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
29d50 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
29d60 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
29d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29d80 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2f 2a  SECURE_DELETE./*
29d90 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
29da0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
29db0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
29dc0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
29dd0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
29de0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
29df0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
29e00 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
29e10 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
29e20 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
29e30 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
29e40 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
29e50 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
29e60 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
29e70 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
29e80 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
29e90 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
29ea0 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
29eb0 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
29ec0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
29ed0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
29ee0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
29ef0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
29f00 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
29f10 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
29f20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
29f30 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
29f40 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
29f50 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
29f60 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
29f70 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
29f80 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
29f90 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
29fa0 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
29fb0 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
29fc0 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
29fd0 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
29fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
29ff0 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
2a000 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2a010 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a020 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
2a030 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2a040 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
2a050 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
2a060 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2a070 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
2a080 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
2a090 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
2a0a0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
2a0b0 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
2a0c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2a0d0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
2a0e0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2a0f0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
2a100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2a110 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2a120 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2a130 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2a140 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2a150 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2a160 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ed(SQLITE_SECURE
2a170 5f 44 45 4c 45 54 45 29 20 2a 2f 0a 0a 2f 2a 0a  _DELETE) */../*.
2a180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a190 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
2a1a0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2a1b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a1c0 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
2a1d0 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
2a1e0 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
2a1f0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2a200 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
2a210 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
2a220 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
2a230 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
2a240 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2a250 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
2a260 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
2a270 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2a280 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2a290 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
2a2a0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
2a2b0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
2a2c0 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
2a2d0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
2a2e0 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
2a2f0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
2a300 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2a310 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
2a320 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
2a330 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
2a340 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
2a350 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
2a360 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
2a370 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
2a380 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2a390 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
2a3a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2a3b0 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
2a3c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2a3d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a3e0 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
2a3f0 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
2a400 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
2a410 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
2a420 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
2a430 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
2a440 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
2a450 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2a460 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
2a470 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
2a480 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
2a490 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
2a4a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a4b0 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72  OK;..  /* Declar
2a4c0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2a4d0 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
2a4e0 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66  r 'isDirect'. If
2a4f0 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63   the.  ** atomic
2a500 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2a510 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69  ion is enabled i
2a520 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68  n this build, th
2a530 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a  en isDirect.  **
2a540 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2a550 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
2a560 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72  sed as the isDir
2a570 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  ectMode paramete
2a580 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66  r.  ** to this f
2a590 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69  unction. Otherwi
2a5a0 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  se, it is always
2a5b0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20   set to zero..  
2a5c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61  **.  ** The idea
2a5d0 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20   is that if the 
2a5e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2a5f0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74  imization is not
2a600 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74  .  ** enabled at
2a610 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2a620 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20  he compiler can 
2a630 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f  omit the tests o
2a640 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74  f.  ** 'isDirect
2a650 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c  ' below, as well
2a660 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e   as the block en
2a670 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20  closed in the.  
2a680 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74  ** "if( isDirect
2a690 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20   )" condition.. 
2a6a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2a6b0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2a6c0 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20  _WRITE.# define 
2a6d0 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20  DIRECT_MODE 0.  
2a6e0 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
2a6f0 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  Mode==0 );.  UNU
2a700 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
2a710 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c  DirectMode);.#el
2a720 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  se.# define DIRE
2a730 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74  CT_MODE isDirect
2a740 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61  Mode.#endif..  a
2a750 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2a760 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2a770 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70  RVED );.  if( !p
2a780 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2a790 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
2a7a0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
2a7b0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
2a7e0 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
2a7f0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
2a800 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
2a810 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
2a820 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
2a830 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
2a840 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2a850 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
2a860 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2a870 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
2a880 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
2a890 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
2a8a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a8b0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2a8c0 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
2a8d0 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
2a8e0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
2a8f0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
2a900 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
2a910 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
2a920 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
2a930 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
2a940 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
2a950 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
2a960 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
2a970 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20  able.  When not 
2a980 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  in .    ** direc
2a990 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69  t mode, page 1 i
2a9a0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e  s always held in
2a9b0 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65   cache and hence
2a9c0 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a   the PagerGet().
2a9d0 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20      ** above is 
2a9e0 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75  always successfu
2a9f0 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c  l - hence the AL
2aa00 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49  WAYS on rc==SQLI
2aa10 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20  TE_OK..    */.  
2aa20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f    if( !DIRECT_MO
2aa30 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d  DE && ALWAYS(rc=
2aa40 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
2aa50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2aa60 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
2aa70 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
2aa80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aa90 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
2aaa0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2aab0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
2aac0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
2aad0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
2aae0 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2aaf0 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
2ab00 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
2ab10 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
2ab20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2ab30 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
2ab40 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2ab50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
2ab60 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
2ab70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2ab80 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2ab90 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2aba0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2abb0 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2abc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
2abd0 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
2abe0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
2abf0 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
2ac00 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61  pData;.        a
2ac10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2ac20 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
2ac30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2ac40 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2ac50 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
2ac60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
2ac70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ac80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ac90 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2aca0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2acb0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
2acc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2acd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
2ace0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2acf0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2ad00 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
2ad10 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
2ad20 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
2ad30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2ad40 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
2ad50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ad60 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
2ad70 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
2ad80 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
2ad90 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
2ada0 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
2adb0 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
2adc0 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
2add0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2ade0 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
2adf0 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
2ae00 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
2ae10 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2ae20 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2ae30 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
2ae40 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2ae50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2ae60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2ae70 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
2ae80 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aeb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2aec0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2aed0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2aee0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
2aef0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2af00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2af10 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2af20 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2af30 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2af40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2af50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2af60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2af70 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
2af80 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
2af90 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
2afa0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
2afb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
2afc0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
2afd0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
2afe0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
2aff0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
2b000 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
2b010 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
2b020 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
2b030 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
2b040 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
2b050 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
2b060 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b070 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
2b080 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2b090 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
2b0a0 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
2b0b0 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
2b0c0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2b0d0 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
2b0e0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2b0f0 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
2b100 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
2b110 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
2b120 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2b130 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
2b140 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
2b150 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
2b160 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
2b170 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
2b180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
2b190 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
2b1a0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
2b1b0 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
2b1c0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
2b1d0 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
2b1e0 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
2b1f0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
2b200 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
2b210 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
2b220 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
2b230 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
2b240 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
2b250 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
2b260 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
2b270 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
2b280 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
2b290 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
2b2a0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
2b2b0 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
2b2c0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2b2d0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
2b2e0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
2b2f0 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
2b300 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
2b310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b320 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
2b330 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
2b340 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
2b350 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
2b360 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
2b370 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2b380 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
2b390 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
2b3a0 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
2b3b0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2b3c0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
2b3d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2b3e0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
2b3f0 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
2b400 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
2b410 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
2b420 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
2b430 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
2b440 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b450 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
2b460 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b470 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
2b480 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
2b490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b4a0 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
2b4b0 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
2b4c0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
2b4d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2b4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b4f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2b500 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  /* The dbOrigSiz
2b510 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69  e is never set i
2b520 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f  f journal_mode=O
2b530 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  FF */.  assert( 
2b540 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b550 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2b560 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50  ALMODE_OFF || pP
2b570 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2b580 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
2b590 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
2b5a0 63 75 72 72 65 64 2c 20 74 68 69 73 20 72 6f 75  curred, this rou
2b5b0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
2b5c0 62 65 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c 4c  be called.  ROLL
2b5d0 42 41 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68 65  BACK.  ** is the
2b5e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
2b5f0 70 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72 72 6f  ponse to an erro
2b600 72 2c 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20 20  r, not COMMIT.  
2b610 47 75 61 72 64 20 61 67 61 69 6e 73 74 0a 20 20  Guard against.  
2b620 2a 2a 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 73  ** coding errors
2b630 20 62 79 20 72 65 70 65 61 74 69 6e 67 20 74 68   by repeating th
2b640 65 20 70 72 69 6f 72 20 65 72 72 6f 72 2e 20 2a  e prior error. *
2b650 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2b660 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2b670 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2b680 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45  errCode;..  PAGE
2b690 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53  RTRACE(("DATABAS
2b6a0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
2b6b0 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65  zMaster=%s nSize
2b6c0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
2b6d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b6e0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
2b6f0 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20  r->dbSize));..  
2b700 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
2b710 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2b720 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
2b730 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2b740 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
2b750 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
2b760 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
2b770 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
2b780 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2b790 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d   called, it is m
2b7a0 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20  ostly a no-op.  
2b7b0 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20  However, any.   
2b7c0 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72   ** backup in pr
2b7d0 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20  ogress needs to 
2b7e0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
2b7f0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2b800 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
2b810 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
2b820 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
2b830 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
2b840 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65  _SYNCED && pPage
2b850 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2b860 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
2b870 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64  lowing block upd
2b880 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
2b890 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79  counter. Exactly
2b8a0 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64   how it.    ** d
2b8b0 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73  oes this depends
2b8c0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
2b8d0 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  ot the atomic-up
2b8e0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
2b8f0 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61  n.    ** was ena
2b900 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2b910 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
2b920 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
2b930 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ets the .    ** 
2b940 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61  runtime criteria
2b950 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72   to use the oper
2b960 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20  ation: .    **. 
2b970 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66     **    * The f
2b980 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
2b990 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
2b9a0 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
2b9b0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c  r.    **      bl
2b9c0 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
2b9d0 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20  e-size, and .   
2b9e0 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f   **    * This co
2b9f0 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  mmit is not part
2ba00 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
2ba10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e   transaction, an
2ba20 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78  d.    **    * Ex
2ba30 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68  actly one page h
2ba40 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
2ba50 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68   and store in th
2ba60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2ba70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2ba80 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2ba90 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
2baa0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2bab0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
2bac0 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
2bad0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75  angecounter() fu
2bae0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2baf0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
2bb00 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75  hange.    ** cou
2bb10 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
2bb20 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
2bb30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2bb40 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
2bb50 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70      ** is not ap
2bb60 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73  plicable to this
2bb70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61   transaction, ca
2bb80 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ll sqlite3Journa
2bb90 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a  lCreate().    **
2bba0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
2bbb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
2bbc0 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e  as actually been
2bbd0 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
2bbe0 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  all.    ** pager
2bbf0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2bc00 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20  ter() to update 
2bc10 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2bc20 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20  er in indirect. 
2bc30 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20     ** mode. .   
2bc40 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
2bc50 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
2bc60 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
2bc70 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
2bc80 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  plicable,.    **
2bc90 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72   then call pager
2bca0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2bcb0 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20  ter() to update 
2bcc0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2bcd0 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69  er.    ** in 'di
2bce0 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74  rect' mode. In t
2bcf0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2bd00 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
2bd10 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63  ever be.    ** c
2bd20 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
2bd30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
2bd40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2bd50 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2bd60 57 52 49 54 45 0a 20 20 20 20 50 67 48 64 72 20  WRITE.    PgHdr 
2bd70 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
2bd80 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2bd90 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
2bda0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2bdb0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bdc0 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21  OFF );.    if( !
2bdd0 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
2bde0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
2bdf0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2be00 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
2be10 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
2be20 72 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  r) .     && pPag
2be30 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
2be40 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  er->dbFileSize. 
2be50 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20      && (0==(pPg 
2be60 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2be70 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2be80 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d  >pPCache)) || 0=
2be90 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20  =pPg->pDirty).  
2bea0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70    ){.      /* Up
2beb0 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
2bec0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2bed0 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77  via the direct-w
2bee0 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65  rite method. The
2bef0 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f   .      ** follo
2bf00 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
2bf10 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d  odify the in-mem
2bf20 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
2bf30 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20  on of page 1 .  
2bf40 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64      ** to includ
2bf50 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68  e the updated ch
2bf60 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64  ange counter and
2bf70 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65   then write page
2bf80 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72   1 .      ** dir
2bf90 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
2bfa0 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
2bfb0 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
2bfc0 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a  c-write .      *
2bfd0 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  * property of th
2bfe0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
2bff0 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65  em, this is safe
2c000 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c010 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c020 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c030 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2c040 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2c050 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2c060 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
2c070 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2c080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c090 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2c0a0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c0b0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
2c0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
2c0d0 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61  else.    rc = pa
2c0e0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c0f0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
2c100 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
2c110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c120 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2c130 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20  ase_one_exit;.. 
2c140 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
2c150 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
2c160 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2c170 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
2c180 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62  l pages.    ** b
2c190 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
2c1a0 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
2c1b0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
2c1c0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
2c1d0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69      ** file. Thi
2c1e0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
2c1f0 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
2c200 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   mode..    **.  
2c210 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64    ** Before read
2c220 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69  ing the pages wi
2c230 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
2c240 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2c250 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
2c260 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
2c270 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a  bSize, set dbSiz
2c280 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
2c290 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  lue.    ** that 
2c2a0 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73  it took at the s
2c2b0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
2c2c0 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69  saction. Otherwi
2c2d0 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  se, the.    ** c
2c2e0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
2c2f0 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e  agerGet() return
2c300 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e   zeroed pages in
2c310 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a  stead of .    **
2c320 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72   reading data fr
2c330 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2c340 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
2c350 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c   ** When journal
2c360 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64  _mode==OFF the d
2c370 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77  bOrigSize is alw
2c380 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69  ays zero, so thi
2c390 73 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e  s.    ** block n
2c3a0 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75  ever runs if jou
2c3b0 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20  rnal_mode=OFF.. 
2c3c0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
2c3d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2c3e0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
2c3f0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67  ger->dbSize<pPag
2c400 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2c410 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
2c420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2c430 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2c440 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29  LMODE_OFF).    )
2c450 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20  {.      Pgno i; 
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2c490 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2c4a0 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70  const Pgno iSkip
2c4b0 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
2c4c0 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e  (pPager); /* Pen
2c4d0 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a  ding lock page *
2c4e0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2c4f0 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
2c500 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
2c510 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
2c520 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
2c530 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2c540 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
2c550 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f  igSize;.      fo
2c560 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69  r( i=dbSize+1; i
2c570 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2c580 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
2c590 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
2c5a0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
2c5b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2c5c0 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
2c5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64  {.          PgHd
2c5e0 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
2c5f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
2c600 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2c610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c620 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2c630 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
2c640 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2c650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c660 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2c670 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2c680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2c690 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29  agerWrite(pPage)
2c6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2c6b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2c6c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2c6d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c6e0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2c6f0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2c700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c710 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  } .      pPager-
2c720 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
2c730 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2c740 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2c750 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2c760 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
2c770 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
2c780 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20   master .    ** 
2c790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2c7a0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
2c7b0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
2c7c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2c7d0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d  .    ** or if zM
2c7e0 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e  aster is NULL (n
2c7f0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
2c800 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  ), then this cal
2c810 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
2c820 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72    */.    rc = wr
2c830 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
2c840 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
2c850 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2c860 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2c870 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c880 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
2c890 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2c8a0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f  file. If the ato
2c8b0 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2c8c0 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ization is being
2c8d0 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68  .    ** used, th
2c8e0 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
2c8f0 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
2c900 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
2c910 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72  orm any.    ** r
2c920 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20  eal IO..    */. 
2c930 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2c940 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2c950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c960 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c970 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c980 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
2c990 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
2c9a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2c9b0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ile. */.    rc =
2c9c0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2c9d0 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61  elist(sqlite3Pca
2c9e0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2c9f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
2ca00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ca10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2ca20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2ca30 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
2ca40 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f  );.      goto co
2ca50 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2ca60 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
2ca70 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
2ca80 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
2ca90 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ache);..    /* I
2caa0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
2cab0 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
2cac0 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
2cad0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
2cae0 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
2caf0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
2cb00 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
2cb10 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
2cb20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2cb30 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
2cb40 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2cb50 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2cb60 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  New = pPager->db
2cb70 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e  Size - (pPager->
2cb80 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a  dbSize==PAGER_MJ
2cb90 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
2cba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2cbb0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2cbc0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
2cbd0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2cbe0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
2cbf0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , nNew);.      i
2cc00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cc10 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2cc20 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2cc30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
2cc40 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
2cc50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2cc60 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
2cc70 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
2cc80 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
2cc90 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2cca0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2ccb0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2ccc0 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
2ccd0 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
2cce0 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
2ccf0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2cd00 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
2cd10 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65   }..commit_phase
2cd20 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74  _one_exit:.  ret
2cd30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2cd40 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
2cd50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2cd60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cd70 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  e has been compl
2cd80 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64  etely.** updated
2cd90 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
2cda0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
2cdb0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2cdc0 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73  saction and.** s
2cdd0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54  ynced to disk. T
2cde0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2cdf0 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20  still exists in 
2ce00 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2ce10 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  .** though, and 
2ce20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
2ce30 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
2ce40 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75  t it will eventu
2ce50 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  ally.** be used 
2ce60 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
2ce70 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
2ce80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
2ce90 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2cea0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
2ceb0 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
2cec0 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72  nal file, either
2ced0 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a   by deleting, .*
2cee0 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20  * truncating or 
2cef0 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e  partially zeroin
2cf00 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74  g it, so that it
2cf10 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
2cf20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72  .** for hot-jour
2cf30 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e  nal rollback. On
2cf40 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  ce this is done 
2cf50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2cf60 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c  is.** irrevocabl
2cf70 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  y committed..**.
2cf80 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2cf90 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
2cfa0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2cfb0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
2cfc0 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20  r.** moves into 
2cfd0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2cfe0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
2cff0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2d000 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d010 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
2d020 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
2d030 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2d040 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2d060 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2d070 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2d080 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
2d090 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72  alled if a prior
2d0a0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
2d0b0 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66  red..  ** But if
2d0c0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e   (due to a codin
2d0d0 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72  g error elsewher
2d0e0 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29  e in the system)
2d0f0 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a   it does get.  *
2d100 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72  * called, just r
2d110 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65  eturn the same e
2d120 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75  rror code withou
2d130 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
2d140 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2d150 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2d160 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
2d170 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
2d180 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d190 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
2d1a0 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65  lled if the page
2d1b0 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c  r is not in at l
2d1c0 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f  east.  ** PAGER_
2d1d0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
2d1e0 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74  And indeed SQLit
2d1f0 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69  e never does thi
2d200 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a  s. But it is.  *
2d210 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74  * nice to have t
2d220 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 74 65  his defensive te
2d230 73 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a  st here anyway..
2d240 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2d250 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50  (pPager->state<P
2d260 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29  AGER_RESERVED) )
2d270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2d280 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f  RROR;..  /* An o
2d290 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20  ptimization. If 
2d2a0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
2d2b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
2d2c0 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20  dified during.  
2d2d0 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ** this transact
2d2e0 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69  ion, the pager i
2d2f0 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
2d300 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20  lusive-mode and 
2d310 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65  is.  ** using pe
2d320 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
2d330 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  s, then this fun
2d340 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2d350 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2d360 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2d370 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
2d380 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  tly contains a s
2d390 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  ingle journal . 
2d3a0 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20   ** header with 
2d3b0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73  the nRec field s
2d3c0 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68  et to 0. If such
2d3d0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73   a journal is us
2d3e0 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74  ed as.  ** a hot
2d3f0 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20  -journal during 
2d400 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2d410 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20  back, 0 changes 
2d420 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a  will be made.  *
2d430 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
2d440 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65  e file. So there
2d450 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a   is no need to z
2d460 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ero the journal 
2d470 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69  .  ** header. Si
2d480 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
2d490 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2d4a0 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  de, there is no 
2d4b0 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f  need.  ** to dro
2d4c0 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68  p any locks eith
2d4d0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
2d4e0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2d4f0 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
2d500 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
2d510 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2d520 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2d530 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2d540 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  IST.  ){.    ass
2d550 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2d560 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
2d570 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
2d580 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2d590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2d5a0 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d  PAGERTRACE(("COM
2d5b0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
2d5c0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2d5d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d5e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
2d5f0 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  CED || MEMDB || 
2d600 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2d610 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  ied );.  rc = pa
2d620 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2d630 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2d640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2d650 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2d660 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2d670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
2d680 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
2d690 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
2d6a0 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
2d6b0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
2d6c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d6d0 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20  on performs two 
2d6e0 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tasks:.**.**   1
2d6f0 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20  ) It rolls back 
2d700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d710 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20  , restoring all 
2d720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2d730 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65  d .**      in-me
2d740 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
2d750 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68   to the state th
2d760 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20  ey were in when 
2d770 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2d780 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e  **      was open
2d790 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20  ed, and.**   2) 
2d7a0 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  It finalizes the
2d7b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
2d7c0 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  o that it is not
2d7d0 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a   used for hot.**
2d7e0 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61        rollback a
2d7f0 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74  t any point in t
2d800 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  he future..**.**
2d810 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
2d820 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66  following qualif
2d830 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  ications:.**.** 
2d840 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2d850 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74   file is not yet
2d860 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
2d870 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d880 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e  ed,.**   then on
2d890 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72  ly (2) is perfor
2d8a0 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
2d8b0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f  e there is no jo
2d8c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
2d8d0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a  to roll back..**
2d8e0 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65  .** * If in an e
2d8f0 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
2d900 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
2d910 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29  L, then task (1)
2d920 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72   is .**   perfor
2d930 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66  med. If successf
2d940 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65  ul, task (2). Re
2d950 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
2d960 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20  outcome.**   of 
2d970 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f  either, the erro
2d980 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
2d990 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
2d9a0 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20  o the caller.** 
2d9b0 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53    (i.e. either S
2d9c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
2d9d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
2d9e0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70  **.** * If the p
2d9f0 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
2da00 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c  _RESERVED state,
2da10 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2da20 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20  ). Whether.**   
2da30 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75  or not (1) is su
2da40 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61  ccussful, also a
2da50 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73  ttempt (2). If s
2da60 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
2da70 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b  n.**   SQLITE_OK
2da80 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74  . Otherwise, ent
2da90 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2daa0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2dab0 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72  e first .**   er
2dac0 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74  ror code encount
2dad0 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  ered. .**.**   I
2dae0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2daf0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
2db00 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2db10 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e   was written to.
2db20 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66   .**   So is saf
2db30 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  e to finalize th
2db40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2db50 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62  ven if the playb
2db60 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61  ack .**   (opera
2db70 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20  tion 1) failed. 
2db80 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65  However the page
2db90 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65  r must enter the
2dba0 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
2dbb0 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74    as the content
2dbc0 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
2dbd0 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77  ry cache are now
2dbe0 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   suspect..**.** 
2dbf0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e  * Finally, if in
2dc00 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2dc10 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
2dc20 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a  empt (1). Only.*
2dc30 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20  *   attempt (2) 
2dc40 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73  if (1) is succes
2dc50 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c  sful. Return SQL
2dc60 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
2dc70 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72  sful,.**   other
2dc80 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65  wise enter the e
2dc90 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2dca0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
2dcb0 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  code from the .*
2dcc0 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72  *   failing oper
2dcd0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ation..**.**   I
2dce0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2dcf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
2dd00 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  y have been writ
2dd10 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68  ten to. So if th
2dd20 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20  e.**   playback 
2dd30 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
2dd40 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75  t succeed it wou
2dd50 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
2dd60 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20  o finalize.**   
2dd70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2dd80 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65  . It needs to be
2dd90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
2dda0 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74  e-system so that
2ddb0 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72  .**   some other
2ddc0 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65   process can use
2ddd0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74   it to restore t
2dde0 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74  he database stat
2ddf0 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a  e (by.**   hot-j
2de00 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
2de10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2de20 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
2de30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2de40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2de50 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2de60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2de70 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52  ode */.  PAGERTR
2de80 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE(("ROLLBACK %
2de90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2dea0 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21  ager)));.  if( !
2deb0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2dec0 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  ed || !isOpen(pP
2ded0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2dee0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2def0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2df00 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2df10 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
2df20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2df30 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
2df40 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2df50 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
2df60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2df70 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
2df80 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
2df90 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2dfa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2dfb0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2dfc0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
2dfd0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2dfe0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
2dff0 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2e000 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
2e010 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
2e020 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
2e030 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
2e040 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2e050 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2e060 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
2e070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e080 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e090 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
2e0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2e0b0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
2e0c0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
2e0d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
2e0e0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
2e0f0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2e100 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2e110 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2e120 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
2e130 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
2e140 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
2e150 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2e160 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
2e170 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
2e180 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
2e190 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
2e1a0 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
2e1b0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
2e1c0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
2e1d0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
2e1e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e1f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2e200 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
2e210 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
2e220 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
2e230 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
2e240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2e250 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
2e260 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
2e270 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
2e280 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
2e290 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2e2a0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
2e2b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e2c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2e2d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2e2e0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
2e2f0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
2e300 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
2e310 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2e320 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2e330 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2e340 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2e350 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2e360 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2e370 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2e380 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2e390 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2e3a0 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65  nt(DbPage *pPage
2e3b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2e3c0 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
2e3d0 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a  count(pPage);.}.
2e3e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2e3f0 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
2e400 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2e410 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
2e420 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
2e430 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
2e440 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
2e450 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
2e460 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
2e470 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  0] = sqlite3Pcac
2e480 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2e490 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2e4a0 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [1] = sqlite3Pca
2e4b0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
2e4c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e4d0 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[2] = sqlite3P
2e4e0 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a  cacheGetCachesiz
2e4f0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
2e500 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  e);.  a[3] = pPa
2e510 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2e520 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d   ? (int) pPager-
2e530 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20  >dbSize : -1;.  
2e540 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
2e550 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
2e560 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2e570 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
2e580 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
2e590 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
2e5a0 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
2e5b0 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
2e5c0 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
2e5d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
2e5e0 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
2e5f0 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
2e600 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69  eturn a;.}.#endi
2e610 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
2e620 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
2e630 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
2e640 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2e650 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50  e3PagerIsMemdb(P
2e660 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e670 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d   return MEMDB;.}
2e680 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
2e690 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20  at there are at 
2e6a0 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74  least nSavepoint
2e6b0 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e   savepoints open
2e6c0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a  . If there are.*
2e6d0 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73  * currently less
2e6e0 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74   than nSavepoint
2e6f0 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65  s open, then ope
2e700 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  n one or more sa
2e710 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d  vepoints.** to m
2e720 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65  ake up the diffe
2e730 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75  rence. If the nu
2e740 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2e750 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ts is already.**
2e760 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70   equal to nSavep
2e770 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
2e780 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2e790 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
2e7a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2e7b0 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  n fails, SQLITE_
2e7c0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
2e7d0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a  d. If an error .
2e7e0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2e7f0 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d  opening the sub-
2e800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2e810 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  en an IO error c
2e820 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ode is.** return
2e830 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
2e840 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
2e850 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2e860 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  nSavepoint(Pager
2e870 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53   *pPager, int nS
2e880 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2e890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2e8c0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
2e8d0 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72  Current = pPager
2e8e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  ->nSavepoint;   
2e8f0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2e900 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
2e910 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  ints */..  if( n
2e920 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65  Savepoint>nCurre
2e930 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  nt && pPager->us
2e940 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2e950 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2e980 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2e990 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
2e9a0 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20  nt *aNew;       
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e9c0 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ew Pager.aSavepo
2e9d0 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20  int array */..  
2e9e0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72    /* Either ther
2e9f0 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a  e is no active j
2ea00 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75  ournal or the su
2ea10 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  b-journal is ope
2ea20 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65  n or .    ** the
2ea30 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61   journal is alwa
2ea40 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ys stored in mem
2ea50 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ory */.    asser
2ea60 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2ea70 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70  point==0 || isOp
2ea80 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2ea90 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2eaa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2eab0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2eac0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
2ead0 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68  ..    /* Grow th
2eae0 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
2eaf0 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72  nt array using r
2eb00 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e  ealloc(). Return
2eb10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
2eb20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f    ** if the allo
2eb30 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74  cation fails. Ot
2eb40 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68  herwise, zero th
2eb50 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e  e new portion in
2eb60 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20   case a .    ** 
2eb70 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2eb80 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75  ccurs while popu
2eb90 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65  lating it in the
2eba0 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62   for(...) loop b
2ebb0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
2ebc0 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61   aNew = (PagerSa
2ebd0 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65  vepoint *)sqlite
2ebe0 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
2ebf0 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
2ec00 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67  oint, sizeof(Pag
2ec10 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61  erSavepoint)*nSa
2ec20 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20  vepoint.    );. 
2ec30 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a     if( !aNew ){.
2ec40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ec50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2ec60 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65  .    memset(&aNe
2ec70 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20  w[nCurrent], 0, 
2ec80 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72  (nSavepoint-nCur
2ec90 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50  rent) * sizeof(P
2eca0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b  agerSavepoint));
2ecb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61  .    pPager->aSa
2ecc0 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a  vepoint = aNew;.
2ecd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
2ece0 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f  epoint = nSavepo
2ecf0 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70  int;..    /* Pop
2ed00 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53  ulate the PagerS
2ed10 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
2ed20 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74  res just allocat
2ed30 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
2ed40 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e  i=nCurrent; ii<n
2ed50 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2ed60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ed70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
2ed80 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65  lid );.      aNe
2ed90 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50  w[ii].nOrig = pP
2eda0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2edb0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
2edc0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 41  Pager->jfd) && A
2edd0 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f  LWAYS(pPager->jo
2ede0 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20  urnalOff>0) ){. 
2edf0 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
2ee00 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  iOffset = pPager
2ee10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
2ee20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ee30 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
2ee40 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  set = JOURNAL_HD
2ee50 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
2ee60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77      }.      aNew
2ee70 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70  [ii].iSubRec = p
2ee80 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a  Pager->nSubRec;.
2ee90 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70        aNew[ii].p
2eea0 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71  InSavepoint = sq
2eeb0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2eec0 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
2eed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
2eee0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
2eef0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
2ef00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ef10 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2ef20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  }..    /* Open t
2ef30 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2ef40 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
2ef50 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  eady opened. */.
2ef60 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2ef70 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2ef80 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e 63  .    assertTrunc
2ef90 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
2efa0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
2efb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2efc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2efd0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
2efe0 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65  lback or release
2eff0 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65   (commit) a save
2f000 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61  point..** The sa
2f010 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61  vepoint to relea
2f020 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  se or rollback n
2f030 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d  eed not be the m
2f040 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a  ost recently .**
2f050 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2f060 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  nt..**.** Parame
2f070 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73  ter op is always
2f080 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
2f090 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41  T_ROLLBACK or SA
2f0a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
2f0b0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56  .** If it is SAV
2f0c0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
2f0d0 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64  then release and
2f0e0 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76   destroy the sav
2f0f0 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69  epoint with.** i
2f100 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e  ndex iSavepoint.
2f110 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
2f120 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
2f130 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  en rollback all 
2f140 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20  changes.** that 
2f150 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69  have occurred si
2f160 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65  nce the specifie
2f170 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20  d savepoint was 
2f180 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  created..**.** T
2f190 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20  he savepoint to 
2f1a0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
2f1b0 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65  ase is identifie
2f1c0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a  d by parameter .
2f1d0 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41  ** iSavepoint. A
2f1e0 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e   value of 0 mean
2f1f0 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  s to operate on 
2f200 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2f210 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20  vepoint.** (the 
2f220 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20  first created). 
2f230 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65  A value of (Page
2f240 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20  r.nSavepoint-1) 
2f250 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a  means operate.**
2f260 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
2f270 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61  ently created sa
2f280 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76  vepoint. If iSav
2f290 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
2f2a0 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72  r than.** (Pager
2f2b0 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20  .nSavepoint-1), 
2f2c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2f2d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2f2e0 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69  *.** If a negati
2f2f0 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ve value is pass
2f300 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2f310 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ion, then the cu
2f320 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
2f330 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
2f340 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
2f350 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e  ferent to callin
2f360 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
2f370 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63  erRollback() bec
2f380 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
2f390 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d  on does not term
2f3a0 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61  inate.** the tra
2f3b0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f  nsaction or unlo
2f3c0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
2f3d0 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65   it just restore
2f3e0 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  s the .** conten
2f3f0 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
2f400 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
2f410 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  al state. .**.**
2f420 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c   In any case, al
2f430 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74  l savepoints wit
2f440 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  h an index great
2f450 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69  er than iSavepoi
2f460 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72  nt .** are destr
2f470 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73  oyed. If this is
2f480 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61   a release opera
2f490 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f  tion (op==SAVEPO
2f4a0 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a  INT_RELEASE),.**
2f4b0 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   then savepoint 
2f4c0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c  iSavepoint is al
2f4d0 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  so destroyed..**
2f4e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f4f0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2f500 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2f510 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2f520 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e   fails,.** or an
2f530 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2f540 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2f550 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69  curs while rolli
2f560 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61  ng back a .** sa
2f570 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65  vepoint. If no e
2f580 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c  rrors occur, SQL
2f590 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2f5a0 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ed..*/ .int sqli
2f5b0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
2f5c0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
2f5d0 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
2f5e0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2f5f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f600 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53  .  assert( op==S
2f610 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f620 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2f630 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
2f640 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
2f650 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56  nt>=0 || op==SAV
2f660 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2f670 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70  );..  if( iSavep
2f680 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61  oint<pPager->nSa
2f690 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
2f6a0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2f6b0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2f6c0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
2f6d0 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
2f6e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2f6f0 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e  maining savepoin
2f700 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70  ts after this op
2f710 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67  . */..    /* Fig
2f720 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
2f730 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c   savepoints will
2f740 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65   still be active
2f750 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20   after this.    
2f760 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74  ** operation. St
2f770 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ore this value i
2f780 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65  n nNew. Then fre
2f790 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f  e resources asso
2f7a0 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77  ciated .    ** w
2f7b0 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e  ith any savepoin
2f7c0 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74  ts that are dest
2f7d0 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70  royed by this op
2f7e0 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
2f7f0 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65      nNew = iSave
2f800 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56  point + (op==SAV
2f810 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
2f820 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65  ;.    for(ii=nNe
2f830 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  w; ii<pPager->nS
2f840 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2f850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
2f860 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
2f870 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
2f880 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
2f890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
2f8a0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
2f8b0 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49   nNew;..    /* I
2f8c0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
2f8d0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20  back operation, 
2f8e0 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65  playback the spe
2f8f0 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
2f900 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
2f910 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c   is a temp-file,
2f920 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2f930 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2f940 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a   file has.    **
2f950 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2f960 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
2f970 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65  se there have be
2f980 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
2f990 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
2f9a0 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68  base file, so th
2f9b0 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61  e playback opera
2f9c0 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70  tion can be skip
2f9d0 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ped..    */.    
2f9e0 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
2f9f0 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69 73  T_ROLLBACK && is
2fa00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2fa10 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
2fa20 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
2fa30 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30  point = (nNew==0
2fa40 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61  )?0:&pPager->aSa
2fa50 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b  vepoint[nNew-1];
2fa60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2fa70 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
2fa80 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65  nt(pPager, pSave
2fa90 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73  point);.      as
2faa0 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f  sert(rc!=SQLITE_
2fab0 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  DONE);.    }.  .
2fac0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2fad0 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74  s a release of t
2fae0 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
2faf0 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65  epoint, truncate
2fb00 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
2fb10 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f  -journal to zero
2fb20 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
2fb30 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  */.    if( nNew=
2fb40 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  =0 && op==SAVEPO
2fb50 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20 69  INT_RELEASE && i
2fb60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2fb70 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
2fb80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2fb90 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  OK );.      rc =
2fba0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
2fbb0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2fbc0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65   0);.      pPage
2fbd0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
2fbe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2fbf0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fc00 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
2fc10 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
2fc20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2fc30 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2fc40 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
2fc50 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
2fc60 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2fc70 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
2fc80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2fc90 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
2fca0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
2fcb0 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
2fcc0 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
2fcd0 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
2fce0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2fcf0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
2fd00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2fd10 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
2fd20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fd30 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
2fd40 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
2fd50 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
2fd60 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
2fd70 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
2fd80 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
2fd90 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
2fda0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
2fdb0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
2fdc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2fdd0 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
2fde0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2fdf0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2fe00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
2fe10 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2fe20 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
2fe30 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
2fe40 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2fe50 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
2fe60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2fe70 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
2fe80 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
2fe90 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
2fea0 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
2feb0 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
2fec0 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
2fed0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
2fee0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
2fef0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2ff00 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2ff10 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
2ff20 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
2ff30 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
2ff40 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20  or retrieve the 
2ff50 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
2ff60 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ager.*/.static v
2ff70 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2ff80 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
2ff90 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
2ffa0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
2ffb0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2ffc0 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  t),.  void (*xCo
2ffd0 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
2ffe0 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76  d*,int,int),.  v
2fff0 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
30000 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  )(void*),.  void
30010 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66   *pCodec.){.  if
30020 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
30030 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
30040 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
30050 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61  ->pCodec);.  pPa
30060 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50  ger->xCodec = pP
30070 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20  ager->memDb ? 0 
30080 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  : xCodec;.  pPag
30090 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
300a0 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43  ng = xCodecSizeC
300b0 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  hng;.  pPager->x
300c0 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64  CodecFree = xCod
300d0 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72  ecFree;.  pPager
300e0 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65  ->pCodec = pCode
300f0 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74  c;.  pagerReport
30100 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  Size(pPager);.}.
30110 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c  static void *sql
30120 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65  ite3PagerGetCode
30130 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
30140 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
30150 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e  r->pCodec;.}.#en
30160 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
30170 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30180 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
30190 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
301a0 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
301b0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
301c0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
301d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
301e0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
301f0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
30200 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
30210 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
30220 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
30230 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
30240 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
30250 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
30260 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
30270 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
30280 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
30290 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
302a0 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
302b0 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
302c0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
302d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
302e0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
302f0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
30300 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
30310 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
30320 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
30330 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
30340 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
30350 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
30360 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
30370 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
30380 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
30390 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
303a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
303b0 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
303c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
303d0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
303e0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
303f0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
30400 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
30410 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
30420 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
30430 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
30440 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
30450 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
30460 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
30470 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
30480 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
30490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
304a0 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
304b0 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
304c0 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
304d0 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
304e0 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
304f0 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
30500 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
30510 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
30520 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
30530 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
30540 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
30550 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
30560 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
30570 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
30580 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
30590 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
305a0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
305b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
305c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
305d0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
305e0 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
305f0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
30600 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
30610 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  rs. Otherwise, i
30620 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
30630 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
30640 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
30650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
30660 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
30670 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f  o pgno, int isCo
30680 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  mmit){.  PgHdr *
30690 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  pPgOld;         
306a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
306b0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
306c0 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  ten. */.  Pgno n
306d0 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
306e0 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61         /* Old va
306f0 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f  lue of pPg->pgno
30700 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71  , if sync is req
30710 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  uired */.  int r
30720 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
30730 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30740 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n code */.  Pgno
30750 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20   origPgno;      
30760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30770 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75  original page nu
30780 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mber */..  asser
30790 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
307a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
307b0 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  age being moved 
307c0 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73  is dirty and has
307d0 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20   not been saved 
307e0 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  by the latest.  
307f0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ** savepoint, th
30800 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72  en save the curr
30810 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
30820 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
30830 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
30840 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  nal now. This is
30850 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
30860 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  dle the followin
30870 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a  g scenario:.  **
30880 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
30890 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
308a0 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f   page X, then mo
308b0 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72  dify it in memor
308c0 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45  y>.  **     SAVE
308d0 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20  POINT one;.  ** 
308e0 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65        <Move page
308f0 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59   X to location Y
30900 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  >.  **     ROLLB
30910 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a  ACK TO one;.  **
30920 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20  .  ** If page X 
30930 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e  were not written
30940 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
30950 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75  nal here, it wou
30960 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70  ld not.  ** be p
30970 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f  ossible to resto
30980 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  re its contents 
30990 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
309a0 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20  CK TO one".  ** 
309b0 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69  statement were i
309c0 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  s processed..  *
309d0 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61  *.  ** subjourna
309e0 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64  lPage() may need
309f0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
30a00 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d  ce to store pPg-
30a10 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20  >pgno into.  ** 
30a20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
30a30 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54  point bitvecs. T
30a40 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f  his is the reaso
30a50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
30a60 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
30a70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
30a80 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
30a90 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
30aa0 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69  .   && subjRequi
30ab0 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
30ac0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
30ad0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
30ae0 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20  ge(pPg)).  ){.  
30af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30b00 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
30b10 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
30b20 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
30b30 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
30b40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
30b50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
30b60 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  , (pPg->flags&PG
30b70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
30b80 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f  :0, pgno));.  IO
30b90 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
30ba0 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
30bb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
30bc0 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  o))..  /* If the
30bd0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
30be0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
30bf0 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70  fore page pPg->p
30c00 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20  gno can.  ** be 
30c10 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72  written to, stor
30c20 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c  e pPg->pgno in l
30c30 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65  ocal variable ne
30c40 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a  edSyncPgno..  **
30c50 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43  .  ** If the isC
30c60 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
30c70 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  t, there is no n
30c80 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
30c90 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  that.  ** the jo
30ca0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
30cb0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
30cc0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
30cd0 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20  pPg->pgno .  ** 
30ce0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
30cf0 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
30d00 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
30d10 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
30d20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  to it..  */.  if
30d30 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
30d40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26  HDR_NEED_SYNC) &
30d50 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  & !isCommit ){. 
30d60 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
30d70 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
30d80 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
30d90 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
30da0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
30db0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
30dc0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
30dd0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
30de0 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
30df0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
30e00 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  c );.  }..  /* I
30e10 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
30e20 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
30e30 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
30e40 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
30e50 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  * from its hash 
30e60 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
30e70 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
30e80 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
30e90 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
30ea0 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
30eb0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
30ec0 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
30ed0 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
30ee0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
30ef0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
30f00 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
30f10 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67  NEED_SYNC;.  pPg
30f20 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
30f30 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
30f40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
30f50 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e  Old || pPgOld->n
30f60 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Ref==1 );.  if( 
30f70 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50  pPgOld ){.    pP
30f80 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67  g->flags |= (pPg
30f90 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  Old->flags&PGHDR
30fa0 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20  _NEED_SYNC);.   
30fb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
30fc0 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  op(pPgOld);.  }.
30fd0 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50  .  origPgno = pP
30fe0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74  g->pgno;.  sqlit
30ff0 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
31000 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  , pgno);.  sqlit
31010 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
31020 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
31030 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
31040 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
31050 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
31060 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
31070 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
31080 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
31090 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
310a0 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
310b0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
310c0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
310d0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
310e0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
310f0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
31100 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
31110 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
31120 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
31130 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
31140 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
31150 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
31160 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
31170 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
31180 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
31190 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
311a0 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
311b0 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
311c0 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
311d0 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
311e0 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
311f0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
31200 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
31210 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
31220 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
31230 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
31240 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
31250 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
31260 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
31270 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
31280 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
31290 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
312a0 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
312b0 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
312c0 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
312d0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
312e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
312f0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
31300 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
31310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31320 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
31330 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
31340 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31350 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
31360 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
31370 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
31380 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
31390 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
313a0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
313b0 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
313c0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
313d0 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
313e0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
313f0 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
31400 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
31410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31420 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
31430 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31440 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
31450 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
31460 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
31470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31480 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
31490 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
314a0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
314b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
314c0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
314d0 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ce!=0 );.       
314e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
314f0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
31500 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
31510 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54  Pgno, pPager->pT
31520 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
31530 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
31540 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
31550 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
31560 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
31570 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
31580 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
31590 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20    pPgHdr->flags 
315a0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
315b0 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  NC;.    sqlite3P
315c0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
315d0 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
315e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
315f0 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gHdr);.  }..  /*
31600 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  .  ** For an in-
31610 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
31620 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   make sure the o
31630 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
31640 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65  tinues.  ** to e
31650 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68  xist, in case th
31660 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  e transaction ne
31670 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eds to roll back
31680 2e 20 20 57 65 20 61 6c 6c 6f 63 61 74 65 0a 20  .  We allocate. 
31690 20 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 6f 77   ** the page now
316a0 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 61 74 20  , instead of at 
316b0 72 6f 6c 6c 62 61 63 6b 2c 20 62 65 63 61 75 73  rollback, becaus
316c0 65 20 77 65 20 63 61 6e 20 62 65 74 74 65 72 20  e we can better 
316d0 64 65 61 6c 0a 20 20 2a 2a 20 77 69 74 68 20 61  deal.  ** with a
316e0 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
316f0 65 72 72 6f 72 20 6e 6f 77 2e 20 20 54 69 63 6b  error now.  Tick
31700 65 74 20 23 33 37 36 31 2e 0a 20 20 2a 2f 0a 20  et #3761..  */. 
31710 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
31720 20 20 44 62 50 61 67 65 20 2a 70 4e 65 77 3b 0a    DbPage *pNew;.
31730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31740 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
31750 67 65 72 2c 20 6f 72 69 67 50 67 6e 6f 2c 20 26  ger, origPgno, &
31760 70 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 69 66  pNew, 1);.    if
31770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31780 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31790 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
317a0 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 20  origPgno);.     
317b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
317c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
317d0 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20  erUnref(pNew);. 
317e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
317f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
31800 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
31810 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31820 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
31830 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
31840 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
31850 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
31860 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
31870 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
31880 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
31890 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
318a0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
318b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
318c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
318d0 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
318e0 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
318f0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
31900 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
31910 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
31920 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
31930 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
31940 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
31950 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a  rn pPg->pExtra;.
31960 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
31970 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
31980 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
31990 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
319a0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
319b0 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
319c0 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
319d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
319e0 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
319f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31a00 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
31a10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31a20 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
31a30 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
31a40 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
31a50 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
31a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
31a70 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
31a80 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
31a90 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
31aa0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
31ab0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
31ac0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
31ad0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
31ae0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
31af0 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
31b00 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
31b10 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
31b20 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
31b30 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
31b40 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
31b50 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
31b60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31b70 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
31b80 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
31b90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
31ba0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
31bb0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
31bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
31bd0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
31be0 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
31bf0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
31c00 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
31c10 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
31c20 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
31c30 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
31c40 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
31c50 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
31c60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31c70 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  eMode = (u8)eMod
31c80 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
31c90 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
31ca0 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
31cb0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
31cc0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
31cd0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
31ce0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
31cf0 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
31d00 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31d10 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a  RNALMODE_QUERY.*
31d20 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31d30 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
31d40 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
31d50 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
31d60 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31d70 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
31d80 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31d90 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20  ALMODE_OFF.**   
31da0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31db0 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20  DE_MEMORY.**.** 
31dc0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
31dd0 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
31de0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
31df0 5f 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  _mode is set to 
31e00 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65  the.** value spe
31e10 63 69 66 69 65 64 20 69 66 20 74 68 65 20 63 68  cified if the ch
31e20 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e  ange is allowed.
31e30 20 20 54 68 65 20 63 68 61 6e 67 65 20 69 73 20    The change is 
31e40 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f  disallowed.** fo
31e50 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
31e60 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  reasons:.**.**  
31e70 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79   *  An in-memory
31e80 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e   database can on
31e90 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72  ly have its jour
31ea0 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20  nal_mode set to 
31eb0 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20  _OFF.**      or 
31ec0 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20  _MEMORY..**.**  
31ed0 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   *  The journal 
31ee0 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  mode may not be 
31ef0 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20  changed while a 
31f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
31f10 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ctive..**.** The
31f20 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61   returned indica
31f30 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  te the current (
31f40 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
31f50 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  ) journal-mode..
31f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31f70 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  gerJournalMode(P
31f80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
31f90 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
31fa0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
31fb0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
31fc0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
31fd0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
31fe0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
31ff0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
32000 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
32010 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
32020 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
32030 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32040 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
32050 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
32060 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32070 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
32080 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32090 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
320a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
320b0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
320c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
320d0 45 52 59 3c 30 20 29 3b 0a 20 20 69 66 28 20 65  ERY<0 );.  if( e
320e0 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 21  Mode>=0.   && (!
320f0 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d  MEMDB || eMode==
32100 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32110 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
32120 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
32130 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32140 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21  ODE_OFF).   && !
32150 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32160 65 64 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65  ed.   && (!isOpe
32170 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
32180 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  | 0==pPager->jou
32190 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20  rnalOff).  ){.  
321a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
321b0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
321c0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
321d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
321e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
321f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
32200 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
32210 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
32220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
32230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
32240 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
32250 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
32260 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
32270 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69  les..**.** Setti
32280 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69  ng the size limi
32290 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  t to -1 means no
322a0 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63   limit is enforc
322b0 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70  ed..** An attemp
322c0 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74  t to set a limit
322d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31   smaller than -1
322e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
322f0 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72  i64 sqlite3Pager
32300 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
32310 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
32320 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69  i64 iLimit){.  i
32330 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b  f( iLimit>=-1 ){
32340 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
32350 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
32360 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  iLimit;.  }.  re
32370 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  turn pPager->jou
32380 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d  rnalSizeLimit;.}
32390 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
323a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
323b0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
323c0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61  variable. The ba
323d0 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  ckup module.** i
323e0 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74  n backup.c maint
323f0 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ains the content
32400 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c   of this variabl
32410 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  e. This module.*
32420 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65  * uses it opaque
32430 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ly as an argumen
32440 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b  t to sqlite3Back
32450 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a  upRestart() and.
32460 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  ** sqlite3Backup
32470 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a  Update() only..*
32480 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  /.sqlite3_backup
32490 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42   **sqlite3PagerB
324a0 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a  ackupPtr(Pager *
324b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
324c0 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  n &pPager->pBack
324d0 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  up;.}..#endif /*
324e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
324f0 4b 49 4f 20 2a 2f 0a                             KIO */.