/ Hex Artifact Content
Login

Artifact a0ed14b86de9d012a962b83389ca01003b6acccb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
0370: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
0380: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
0390: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03a0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03b0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
03c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
03d0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
03e0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
03f0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0410: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0420: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0430: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0440: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0450: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
0460: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
0470: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0480: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
0490: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04a0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04b0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
04c0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
04d0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
04e0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
04f0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0500: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0510: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0520: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0530: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0540: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0550: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
0560: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
0570: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
0580: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
0590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05a0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05b0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
05c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
05d0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
05e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
05f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0600: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0620: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0630: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0640: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0650: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0660: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0680: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
06c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
06d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
06e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
06f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0710: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0720: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0730: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0740: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0750: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0780: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0790: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
07c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
07d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0800: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0810: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0820: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0830: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0840: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0850: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0880: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0890: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08a0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
08d0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
08e0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
08f0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0920: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0930: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0960: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0970: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0980: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0990: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09a0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
09c0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
09d0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
09e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0a60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0a70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0a90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0aa0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0ab0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0ac0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0ad0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ae0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0af0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0b70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0ba0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bb0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0bc0: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0bf0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c30: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c40: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c50: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0c60: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0c70: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0c80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0c90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ca0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cb0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0cc0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0cd0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0ce0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0cf0: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d00: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d10: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d20: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d30: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d40: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d50: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0d60: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d90: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0da0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0db0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0dc0: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0dd0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0de0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0df0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e00: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e10: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e40: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e50: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0e60: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0e70: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0e80: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0e90: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ea0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0eb0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0ec0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0ed0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0ee0: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0ef0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f00: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f10: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f30: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f40: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f50: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0f60: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0f70: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0f80: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0f90: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fa0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0fb0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
0fc0: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
0fd0: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
0fe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0ff0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1000: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1010: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1020: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1030: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1050: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
1060: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1080: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
1090: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10a0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10b0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
10c0: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41        5../*.** A
10d0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
10e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
10f0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1100: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1110: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1120: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1130: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
1140: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
1150: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1160: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
1170: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
1180: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
1190: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
11a0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
11b0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
11c0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
11e0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
11f0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
1200: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
1210: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
1220: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
1230: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
1240: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
1250: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
1260: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
1270: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
1280: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
1290: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
12a0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
12b0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
12c0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
12d0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
12e0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
12f0: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
1300: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
1310: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
1320: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
1330: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
1340: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
1350: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
1360: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
1370: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
1380: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
1390: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
27f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
2800: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
2810: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
2820: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
2830: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
2840: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
2850: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2860: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2870: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
2880: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
2890: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
28a0: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
28b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
28c0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
28d0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
2900: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
2910: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2920: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2930: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2940: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2950: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2960: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2970: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2980: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2990: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
29a0: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
29b0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29e0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29f0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2a00: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2a10: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a20: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a30: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a40: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a60: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a70: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a80: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2ab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ac0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ad0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ae0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2af0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2b00: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2b10: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b20: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b30: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b60: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b80: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b90: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2ba0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bd0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bf0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2c00: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2c10: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c20: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c30: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c40: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c50: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c60: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c70: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c80: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c90: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2ca0: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2cb0: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2cc0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2ce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cf0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2d00: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2d10: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d20: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d30: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d40: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d50: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d60: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d70: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d80: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d90: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2da0: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2db0: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2dc0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2dd0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2de0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2df0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2e00: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2e10: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e20: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e40: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e50: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e60: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e70: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2ea0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2eb0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ee0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ef0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2f00: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2f10: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f30: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f40: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f50: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f70: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f80: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2fa0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fe0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2ff0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3010: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3020: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3030: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3040: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3060: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3070: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
3080: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
3090: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30a0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
30b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
30c0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
3110: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
3120: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
3130: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
3140: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3150: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3170: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3190: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
31a0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
31b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
31c0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
31d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
31e0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
3200: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
3210: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
3220: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
3230: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3250: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3260: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3270: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
3280: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
32b0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
32c0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
32d0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
32e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
32f0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3310: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
3320: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
3330: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3340: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
3350: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
3360: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
3370: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
3380: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
3390: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
33b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
33e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3400: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
3410: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3420: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3430: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3450: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
3460: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
3470: 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53  ader */.  PagerS
3480: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
3490: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
34a0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
34b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
34c0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
34d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
34f0: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
3500: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
3510: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
3520: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
3530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3540: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73  anges */.  u32 s
3550: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3560: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3570: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3580: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3590: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
35c0: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
35d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
35e0: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
3610: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
3620: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
3630: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3650: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
3660: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
3670: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
36a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
36b0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
36e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
36f0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
3700: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
3710: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
3730: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
3740: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3770: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
3780: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
3790: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
37a0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
37b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
37c0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
37d0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
37e0: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
37f0: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
3800: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3810: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
3830: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
3840: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
3850: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
3860: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3870: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
3880: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3890: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
38a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
38b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
38c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
38d0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
38e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
38f0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
3900: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3910: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3920: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3930: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3940: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
3950: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
3960: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
3970: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
3980: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
3990: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
39a0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
39b0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
39c0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
39d0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
3a00: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
3a10: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
3a20: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
3a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a40: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
3a50: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
3a60: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69  r tmp use */.  i
3a70: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
3a80: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
3a90: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
3aa0: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
3ab0: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68  files */.  PCach
3ac0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
3ad0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ae0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
3af0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
3b00: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
3b10: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
3b20: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
3b30: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
3b40: 63 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  cesses */.};../*
3b50: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3b60: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
3b70: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
3b80: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
3b90: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
3ba0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
3bb0: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
3bc0: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
3bd0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
3be0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
3bf0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
3c00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3c10: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
3c20: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
3c30: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
3c50: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
3c60: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
3c70: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
3c80: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
3c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3ca0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
3cb0: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
3cc0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
3cd0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3cf0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
3d00: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
3d10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
3d20: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
3d30: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
3d40: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
3d50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3d60: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3d70: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3d80: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3d90: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3da0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3db0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3dc0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
3dd0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
3de0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
3df0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3e00: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
3e10: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
3e20: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3e30: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3e40: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3e50: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3e60: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
3e70: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3e80: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3e90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3ea0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3eb0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3ec0: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
3ed0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
3ee0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
3ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
3f00: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
3f10: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
3f20: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3f30: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3f40: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3f50: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3f60: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3f70: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3f80: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3fa0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3fb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3fc0: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
3fd0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
3fe0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
3ff0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
4000: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
4010: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
4020: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
4030: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
4040: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
4050: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
4060: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
4070: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
4080: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
4090: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
40a0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
40b0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
40c0: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
40d0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
40e0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
40f0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
4100: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
4110: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
4120: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
4130: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
4140: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
4150: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
4160: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
4170: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
4180: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
4190: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
41a0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
41b0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
41c0: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
41d0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
41e0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
41f0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
4200: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
4210: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
4220: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
4230: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
4240: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
4250: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
4260: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4270: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
4280: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
4290: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
42a0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
42b0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
42c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
42d0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
42e0: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
42f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4300: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
4310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
4320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4330: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4340: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4350: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4360: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4370: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
4380: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
43a0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
43b0: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
43c0: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
43d0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
43e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
43f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4400: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4410: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4420: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
4430: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
4440: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
4450: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
4460: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
4470: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
4480: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4490: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
44a0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
44b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
44c0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
44d0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
44e0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
44f0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4500: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4510: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
4530: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
4540: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
4550: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
4560: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
4570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4580: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
4590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45a0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
45b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
45c0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
45d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
45e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
45f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
4600: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
4610: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a  e(pPager) );.*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
4630: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
4640: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
4650: 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20   /* A temp-file 
4660: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47  is always in PAG
4670: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20  ER_EXCLUSIVE or 
4680: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
4690: 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
46a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
46b0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
46c0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
46d0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
46e0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
46f0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
4700: 79 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d  ys set for temp-
4710: 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
4720: 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
4730: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
4740: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
4750: 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  e );..  return 1
4760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4780: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
4790: 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a   to write page *
47a0: 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62  pPg into the sub
47b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70  -journal..** A p
47c0: 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
47d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
47e0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
47f0: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
4800: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e  .** or more open
4810: 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20   savepoints for 
4820: 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  which:.**.**   *
4830: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4840: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
4850: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
4860: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20  avepoint.nOrig, 
4870: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62  and.**   * The b
4880: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
4890: 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d   to the page-num
48a0: 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69  ber is not set i
48b0: 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61  n.**     PagerSa
48c0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
48d0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
48e0: 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73  int subjRequires
48f0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4900: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  {.  Pgno pgno = 
4910: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  pPg->pgno;.  Pag
4920: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4930: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
4940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4950: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
4960: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61  nt; i++){.    Pa
4970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
4980: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
4990: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
49a0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
49b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
49c0: 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53  tvecTest(p->pInS
49d0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
49e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
49f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
4a00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4a20: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
4a30: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
4a40: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
4a50: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
4a60: 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
4a70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
4a80: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
4a90: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  g->pPager->pInJo
4aa0: 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
4ab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
4ac0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4ad0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4ae0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4af0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4b00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4b10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4b20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4b30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4b40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4b50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4b60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4b80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4b90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4ba0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4bb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4bc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
4bd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
4be0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
4bf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
4c00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
4c10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
4c20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
4c30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
4c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4c50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
4c60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
4c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4c90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4ca0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
4cb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
4cc0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
4cd0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
4ce0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
4cf0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
4d00: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
4d10: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4d20: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
4d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4d40: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d50: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
4d60: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4d70: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4d80: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4d90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4da0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
4db0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
4dc0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
4dd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
4de0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4e00: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4e10: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
4e20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
4e30: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
4e40: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
4e50: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
4e60: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
4e70: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
4e80: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
4e90: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
4ea0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
4eb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
4ec0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
4ed0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
4ee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
4ef0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
4f00: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
4f10: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
4f20: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
4f30: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
4f40: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
4f50: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
4f60: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
4f70: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
4f80: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
4f90: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
4fa0: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
4fb0: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
4fc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
4fd0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
4fe0: 66 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20  f( !isOpen(pFd) 
4ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5000: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
5010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
5020: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
5030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5040: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
5050: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
5060: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
5070: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
5080: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
5090: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
50a0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
50b0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
50c0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
50d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
50e0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
50f0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
5100: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
5110: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
5120: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
5130: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
5140: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
5150: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5160: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
5170: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
5180: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
5190: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
51a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
51b0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
51c0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
51d0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
51e0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
51f0: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
5200: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
5210: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
5220: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
5230: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
5240: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
5250: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
5260: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
5270: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
5280: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
5290: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
52a0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
52b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
52c0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
52d0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
52e0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
52f0: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
5300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5310: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
5320: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
5330: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
5340: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
5350: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
5360: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
5370: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
5380: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
53b0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
53c0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
53f0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
5400: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
5410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
5420: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
5430: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
5440: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
5450: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
5460: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5470: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
5480: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
5490: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
54a0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
54b0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
54c0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
54d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
54e0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
54f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
5500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5510: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
5520: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
5530: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
5540: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
5550: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
5560: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
5570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5580: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
5590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
55a0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
55b0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
55c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
55d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
55e0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
55f0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
5600: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
5610: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
5620: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
5630: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
5640: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5650: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
5660: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
5670: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5680: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
5690: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
56a0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
56b0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
56c0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
56d0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
56e0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
56f0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
5700: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5710: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5720: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
5730: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
5740: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
5750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5760: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
5770: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5780: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5790: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
57a0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
57b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
57c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
57d0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
57e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
57f0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
5800: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
5810: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
5820: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
5830: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
5840: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
5850: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
5860: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
5870: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
5880: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
5890: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
58a0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
58b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
58c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
58d0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
58e0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
58f0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
5900: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
5910: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
5920: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
5930: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
5940: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
5950: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
5960: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5970: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5980: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
5990: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
59a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
59b0: 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  ode.      || (pP
59c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
59d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
59e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
59f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
5a00: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
5a10: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
5a20: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
5a40: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
5a50: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
5a60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
5a70: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
5a80: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
5a90: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
5aa0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
5ab0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
5ac0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
5ad0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
5ae0: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
5af0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5b00: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
5b10: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
5b20: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
5b30: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
5b40: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
5b50: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
5b60: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
5b70: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
5b80: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5b90: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
5ba0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
5bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5bc0: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
5bd0: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5be0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
5bf0: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
5c00: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
5c10: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
5c20: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5c30: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
5c40: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
5c50: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
5c60: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
5c70: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
5c80: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5c90: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
5ca0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
5cb0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
5cc0: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
5cd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5ce0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
5cf0: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
5d00: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
5d20: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
5d30: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
5d40: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
5d50: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
5d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
5d70: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
5d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5d90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
5da0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5db0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
5dc0: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
5dd0: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
5de0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
5df0: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
5e00: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
5e10: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
5e20: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
5e30: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
5e40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5e50: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
5e60: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
5e70: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
5e80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5e90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
5ea0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
5eb0: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
5ec0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5ee0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
5ef0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
5f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
5f10: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
5f20: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5f30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5f40: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5f50: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
5f60: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
5f70: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
5f80: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
5fb0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
5fe0: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
5ff0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
6000: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
6010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
6020: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
6030: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
6040: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
6050: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
6070: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
6080: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
6090: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
60c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
60d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
60e0: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
60f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6100: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6110: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
6120: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
6130: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6140: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6150: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
6160: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
6170: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6180: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
6190: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
61a0: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
61b0: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
61c0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
61d0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
61e0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
61f0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6200: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
6210: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
6220: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
6230: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
6240: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6250: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
6260: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6270: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6280: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
6290: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
62a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
62b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
62c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
62d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
62e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
62f0: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
6300: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
6310: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
6320: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
6330: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
6340: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
6350: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
6360: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
6370: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
6380: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
6390: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
63a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
63b0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
63c0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
63d0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
63e0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
63f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
6400: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
6410: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
6420: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
6430: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
6440: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
6450: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
6460: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
6470: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6490: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
64a0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
64b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
64c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
64d0: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
64e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
64f0: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
6500: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
6510: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
6520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
6530: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
6540: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
6550: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6560: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
6570: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
6610: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
6620: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
6630: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
6640: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
6650: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
6660: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
6670: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
6680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6690: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
66a0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
66b0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
66c0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
66d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66e0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
66f0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6700: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6710: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6720: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6730: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6740: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6750: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
6760: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
6770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6780: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6790: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
67a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
67b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
67c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
67d0: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
67e0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
67f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
6800: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
6810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
6820: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
6830: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
6840: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
6850: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
6860: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
6870: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
6880: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
6890: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
68a0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
68b0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
68c0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
68d0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
68e0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
68f0: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
6900: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
6910: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
6920: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
6930: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
6940: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
6950: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6960: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
6970: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
6980: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
6990: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
69a0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
69b0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
69c0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
69d0: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
69e0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
69f0: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
6a00: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
6a10: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
6a20: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
6a30: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
6a40: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6a50: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
6a60: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6a80: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
6a90: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
6aa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
6ab0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
6ac0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
6ad0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6ae0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
6af0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
6b00: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
6b10: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
6b20: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
6b30: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
6b40: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
6b50: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
6b60: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
6b70: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6b80: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
6b90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6bd0: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
6be0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
6bf0: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
6c00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6c10: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
6c20: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
6c30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
6c40: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
6c50: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
6c60: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
6c70: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
6c80: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
6c90: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
6ca0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6cc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
6cd0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
6cf0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
6d00: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
6d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6d30: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
6d40: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
6d50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6d60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6d70: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
6d80: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
6d90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
6da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
6db0: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
6dc0: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
6dd0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
6de0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
6df0: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
6e00: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6e10: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
6e20: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
6e30: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
6e40: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
6e50: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
6e60: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
6e70: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
6e80: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
6e90: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
6ea0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
6eb0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
6ec0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
6ed0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
6ee0: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
6ef0: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
6f00: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
6f10: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
6f20: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
6f30: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
6f40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6f50: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
6f60: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
6f70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6f80: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6f90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
6fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
6fb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
6fc0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
6fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6fe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ff0: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
7000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7030: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7040: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7050: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7060: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7070: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7080: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7090: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
70a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
70b0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
70c0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
70d0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
70e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
70f0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7100: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7110: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7120: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7130: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7140: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7150: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7160: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7170: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7180: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7190: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
71a0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
71b0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
71c0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
71d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
71e0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
71f0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7200: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7210: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
7220: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
7230: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
7240: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7250: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7260: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
7270: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7280: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
7290: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
72a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
72b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
72e0: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
72f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
7300: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
7310: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
7320: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
7330: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
7340: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7350: 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ze;     /* Size 
7360: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
7370: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
7380: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
73b0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
73c0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
73d0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7400: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
7410: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
7420: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
7430: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
7440: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
7450: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
7460: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7470: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
7480: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
7490: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
74a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
74b0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
74c0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
74d0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
74e0: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
74f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7500: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
7510: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
7520: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
7530: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
7540: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
7550: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
7560: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
7570: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
7580: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
7590: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
75a0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
75b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
75c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
75d0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
75e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
7600: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
7610: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7620: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
7630: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
7640: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
7650: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
7660: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
7670: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7680: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7690: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
76a0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
76b0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
76c0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
76d0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
76e0: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
76f0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7700: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
7720: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
7730: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
7740: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
7750: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
7760: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
7770: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7780: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7790: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
77a0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
77b0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
77c0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
77d0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
77e0: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
77f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7800: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7810: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
7820: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
7830: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7840: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
7850: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
7860: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
7870: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7880: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7890: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
78a0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
78b0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
78c0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
78d0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
78e0: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
78f0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7900: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7910: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
7920: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
7930: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
7940: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
7950: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
7960: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7970: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7980: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7990: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
79a0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
79b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
79c0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
79d0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
79e0: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
79f0: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a00: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a10: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7a20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7a30: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7a40: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7a50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7a60: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7a70: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7a80: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7a90: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7aa0: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7ab0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7ac0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7ad0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7ae0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7af0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
7b00: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
7b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7b20: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7b30: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
7b40: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b60: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
7b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
7b80: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
7b90: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7ba0: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
7bb0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7bc0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7bd0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7be0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7bf0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c00: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c10: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c20: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c30: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7c40: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7c70: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7c80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7cb0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7cc0: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7cd0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7ce0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7cf0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d20: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d30: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7d40: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7d50: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7d60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7d70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7d80: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7d90: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7da0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7db0: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7dc0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7dd0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7de0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7df0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e00: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e10: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e20: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e30: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7e40: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7e50: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7e60: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7e70: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7e80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7e90: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7ea0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7eb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ec0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7ed0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ef0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f00: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f10: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f20: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f30: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7f40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7f50: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7f60: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7f70: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7f80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7f90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
7fa0: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
7fb0: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
7fc0: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
7fd0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
7fe0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
7ff0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8000: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8010: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8020: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8030: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
8040: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
8050: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
8060: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
8070: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
8080: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
8090: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
80a0: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
80b0: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
80c0: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
80d0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
80e0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
80f0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8100: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8110: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8120: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
8140: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
8150: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
8160: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
8170: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
8180: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
8190: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
81a0: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
81b0: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
81c0: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
81d0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
81e0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
81f0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8200: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8210: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8220: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8230: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8240: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
8250: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
8260: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
8270: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
8280: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
8290: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
82a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
82b0: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
82c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
82d0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
82e0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
82f0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8300: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8320: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8340: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8350: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
8360: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
8370: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
8380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8390: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
83a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
83b0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
83c0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
83d0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
83e0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
83f0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8400: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8410: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8420: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8430: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
8440: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8450: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
8460: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8470: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
8480: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
8490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
84a0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
84b0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
84c0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
84d0: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
84e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
84f0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8510: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8520: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
8540: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
8550: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
8560: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
8570: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
8580: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
8590: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
85a0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
85b0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
85c0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
85d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
85e0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
85f0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8600: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8610: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8620: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8630: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
8640: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
8650: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
8660: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
8670: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
8680: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
8690: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
86a0: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
86b0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
86c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
86d0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
86e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
86f0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8700: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8710: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8720: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8730: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
8740: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
8750: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
8760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
8770: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
8780: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8790: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
87a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
87b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
87c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
87f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8800: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8810: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8820: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8830: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8840: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8850: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8860: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8880: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8890: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
88a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
88b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
88c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
88d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8910: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8920: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8930: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8940: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8950: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8960: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8970: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8980: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8990: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
89a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
89b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
89c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
89d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
89e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
89f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a00: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a10: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a30: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8a40: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8a50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8a60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8a70: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8a80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8aa0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8ab0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8ac0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8ad0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8ae0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8af0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8b40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8b50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8b70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8b80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8b90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8ba0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8bb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8bc0: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8bd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8bf0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c00: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c10: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c20: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8c40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8c50: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8c60: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8c80: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8cb0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8cc0: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8cd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8cf0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d00: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d10: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d30: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8d40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8d50: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8d60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8d70: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8d80: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8d90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8da0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8db0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8dc0: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8dd0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8de0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e00: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e10: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e30: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e50: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8e60: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8e70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8e90: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8ea0: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8ec0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8ed0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ee0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8ef0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f00: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f10: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f20: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f30: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8f40: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8f50: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8f60: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8f70: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8f80: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8f90: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8fa0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8fb0: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8fc0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8fd0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8fe0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8ff0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9000: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9010: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9040: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
9050: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
9060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
9080: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
9090: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
90a0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
90b0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
90c0: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
90d0: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
90e0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
90f0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9100: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9110: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9120: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9130: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
9140: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
9150: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
9160: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
9170: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
9180: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
9190: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
91a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
91b0: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
91c0: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
91d0: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
91e0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
91f0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
9200: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
9210: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
9220: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
9230: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
9240: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
9250: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
9260: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9270: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
9280: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
9290: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
92a0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
92b0: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
92c0: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
92d0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
92e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
92f0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
9300: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
9310: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
9320: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
9330: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
9340: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
9350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
9360: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
9370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9380: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
9390: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
93a0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
93b0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
93c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
93d0: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
93e0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
93f0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
9400: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
9410: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
9420: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
9430: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
9440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
9450: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
9460: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
9470: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
9480: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
9490: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
94a0: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
94b0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
94c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
94d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
94e0: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
94f0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
9500: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
9510: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
9520: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
9530: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
9540: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
9550: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
9560: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
9570: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
9580: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
9590: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
95a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
95b0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
95c0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
95d0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
95e0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
95f0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
9600: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
9610: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
9620: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
9630: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
9640: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
9650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
9660: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
9670: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
9680: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
9690: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
96a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
96b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
96c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
96d0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
96e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
96f0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9700: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
9710: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
9720: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
9730: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
9750: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
9760: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
9770: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9780: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9790: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
97a0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
97b0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
97c0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
97d0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
97e0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
97f0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
9800: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
9810: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
9820: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
9830: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
9840: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
9850: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
9860: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
9870: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
9880: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
9890: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
98a0: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
98b0: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
98c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
98d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
98e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
98f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
9900: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
9910: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9920: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
9930: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
9940: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
9950: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
9960: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
9970: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
9980: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
9990: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
99a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
99b0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
99c0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
99d0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
99e0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
99f0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
9a00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9a10: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
9a20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
9a30: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
9a40: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9a50: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a80: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
9a90: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9ab0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
9ac0: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
9ad0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9af0: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
9b00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
9b10: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
9b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9b30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
9b50: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
9b60: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9b80: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
9b90: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
9ba0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
9bb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9bc0: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9bf0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
9c00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9c10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9c20: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
9c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c40: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
9c50: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
9c70: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9c80: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
9c90: 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
9ca0: 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
9cb0: 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
9cc0: 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
9cd0: 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
9ce0: 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
9cf0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
9d00: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d10: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
9d20: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9d30: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
9d40: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
9d50: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
9d60: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
9d70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
9d80: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
9d90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
9da0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
9db0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
9dc0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
9dd0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
9de0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
9df0: 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
9e00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
9e10: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
9e20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
9e30: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
9e50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
9e60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
9e70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
9e90: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
9ea0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9eb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9ec0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
9ed0: 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
9ee0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
9ef0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9f00: 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
9f10: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
9f20: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9f30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
9f50: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
9f60: 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
9f70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9f80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9f90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9fa0: 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
9fb0: 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
9fc0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9fd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9fe0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9ff0: 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
a000: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
a010: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
a030: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
a040: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
a050: 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
a060: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a080: 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
a090: 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  20);.  pPager->n
a0a0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
a0b0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
a0c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a0d0: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
a0e0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
a0f0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
a100: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
a110: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
a120: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a130: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a140: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
a150: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
a160: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
a170: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
a180: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
a190: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
a1a0: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
a1b0: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
a1c0: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
a1d0: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
a1e0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
a1f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
a200: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
a210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
a220: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
a230: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
a240: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
a250: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
a260: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
a280: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
a290: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
a2a0: 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
a2b0: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
a2c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
a2d0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
a2e0: 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
a2f0: 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
a300: 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a320: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
a330: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
a340: 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
a350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a360: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
a370: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
a380: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
a390: 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
a3a0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
a3b0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
a3c0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
a3d0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
a3e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
a3f0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
a400: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
a410: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
a420: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
a430: 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
a460: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
a470: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a480: 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
a490: 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
a4a0: 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
a4b0: 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
a4c0: 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
a4d0: 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
a4e0: 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
a4f0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
a500: 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
a510: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
a520: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
a530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
a540: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74  ../*.** Unless t
a550: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a560: 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63  rror-state, disc
a570: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
a580: 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74  y pages. If.** t
a590: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a5a0: 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e  rror-state, then
a5b0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
a5c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  no-op..**.** TOD
a5d0: 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f  O: Why can we no
a5e0: 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  t reset the page
a5f0: 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72  r while in error
a600: 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69   state?.*/.stati
a610: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
a620: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
a630: 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ){.  if( SQLITE_
a640: 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43  OK==pPager->errC
a650: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
a660: 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
a670: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
a680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
a690: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
a6a0: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70  >pPCache);.    p
a6b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
a6c0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
a6d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
a6e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
a6f0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a700: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
a710: 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
a720: 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
a730: 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
a740: 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
a750: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
a760: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
a770: 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
a780: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
a790: 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
a7a0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
a7b0: 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
a7c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
a7d0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
a7e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
a7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
a800: 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
a810: 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
a820: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
a830: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
a850: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
a860: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
a870: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
a880: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
a890: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
a8a0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
a8b0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
a8c0: 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
a8d0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a8e0: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a900: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a910: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a920: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a930: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a940: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a950: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a960: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a970: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a980: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a990: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a9a0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a9b0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a9c0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a9d0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a9e0: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a9f0: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
aa00: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
aa10: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
aa20: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
aa30: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
aa40: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
aa50: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
aa80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
aa90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
aaa0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
aab0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
aac0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
aad0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
aae0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aaf0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
ab00: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
ab10: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
ab20: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
ab30: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
ab40: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
ab50: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
ab60: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
ab70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
ab80: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
ab90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
aba0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
abc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
abd0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
abe0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
abf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
ac00: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
ac10: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
ac20: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
ac30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
ac40: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
ac50: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
ac60: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
ac70: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
ac80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
ac90: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
aca0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
acb0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
acc0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
acd0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
ace0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
acf0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ad00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ad10: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ad20: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ad30: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ad40: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
ad50: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
ad60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
ad70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
ad80: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
ad90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
ada0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
adb0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
adc0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
add0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ade0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
adf0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ae00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ae10: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ae20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ae30: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ae40: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ae50: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
ae70: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
ae80: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
ae90: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
aea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
aeb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
aec0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
aed0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
aee0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
aef0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
af10: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
af20: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
af30: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
af40: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
af50: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
af60: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
af70: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
af80: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
af90: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
afa0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
afb0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
afc0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
afd0: 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74   TODO: Really, t
afe0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
aff0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
b000: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
b010: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
b020: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
b030: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
b040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
b050: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
b060: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = 0;..    rc = o
b070: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b080: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
b090: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
b0a0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b0b0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
b0c0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
b0d0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
b0e0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
b0f0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
b100: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
b110: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
b120: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
b130: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
b140: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
b150: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
b160: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
b170: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
b180: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
b190: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
b1a0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
b1b0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
b1c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
b1d0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
b1e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b1f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
b200: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
b210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b220: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
b230: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
b240: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
b250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
b260: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
b270: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
b280: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
b290: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
b2a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b2b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
b2c0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
b2d0: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
b2e0: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
b2f0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
b300: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
b310: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
b320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b330: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
b340: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
b350: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
b360: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
b370: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
b380: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
b390: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
b3a0: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
b3b0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
b3c0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
b3d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
b3e0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
b3f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
b400: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
b410: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
b420: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
b430: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
b440: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
b450: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
b460: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
b470: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
b480: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
b490: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
b4a0: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
b4b0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
b4c0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
b4d0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
b4e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
b4f0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b500: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
b510: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
b520: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
b530: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
b540: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
b550: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
b560: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b570: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
b580: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b590: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
b5a0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
b5b0: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
b5c0: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
b5d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
b5e0: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
b5f0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
b600: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
b610: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
b620: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
b630: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
b640: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
b650: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
b660: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b670: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
b680: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
b690: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
b6a0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
b6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
b6c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b6d0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
b6e0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
b6f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
b700: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
b710: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
b720: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
b730: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
b740: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
b750: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
b760: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
b770: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b780: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
b790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b7a0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
b7b0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
b7c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
b7d0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
b7e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b800: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
b810: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
b820: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
b830: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
b840: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
b850: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
b860: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
b870: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
b880: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
b890: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
b8a0: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
b8b0: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
b8c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
b8d0: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
b8e0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
b8f0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
b900: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
b910: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
b920: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
b930: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
b940: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
b950: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
b960: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
b970: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
b980: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
b990: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
b9a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b9b0: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
b9c0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
b9d0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
b9e0: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
b9f0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
ba00: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ba10: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
ba20: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
ba30: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
ba40: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
ba50: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
ba60: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
ba70: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
ba80: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
ba90: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
baa0: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
bab0: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
bac0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
bad0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
bae0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
baf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
bb00: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bb10: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
bb20: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
bb30: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
bb40: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
bb50: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
bb60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
bb70: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
bb80: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
bb90: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
bba0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bbb0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
bbc0: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
bbd0: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
bbe0: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
bbf0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
bc00: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
bc10: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
bc20: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
bc30: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
bc40: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
bc50: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
bc60: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
bc70: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
bc80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
bc90: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
bca0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
bcb0: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
bcc0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
bcd0: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
bce0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
bcf0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
bd00: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
bd10: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
bd20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
bd30: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
bd40: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
bd50: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
bd60: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
bd70: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
bd80: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
bd90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bda0: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
bdb0: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
bdc0: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
bdd0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
bde0: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
bdf0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
be00: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
be10: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
be20: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
be30: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
be40: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
be50: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
be60: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
be70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
be80: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
be90: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
bea0: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
beb0: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
bec0: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
bed0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
bee0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
bef0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
bf00: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
bf10: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
bf20: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
bf30: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
bf40: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
bf50: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bf60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
bf70: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
bf80: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
bf90: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
bfa0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
bfb0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
bfc0: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
bfd0: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
bfe0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
bff0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
c000: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
c010: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
c020: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
c030: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
c040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
c050: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
c060: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
c070: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
c080: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
c090: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
c0a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
c0b0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
c0c0: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
c0d0: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
c0e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c0f0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
c100: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
c110: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
c120: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
c130: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
c140: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c150: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
c160: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c170: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c180: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
c190: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
c1a0: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
c1b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
c1c0: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
c1d0: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
c1e0: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
c1f0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
c200: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
c210: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
c220: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
c230: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
c240: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
c250: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
c260: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
c270: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
c280: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
c290: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
c2a0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
c2b0: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
c2c0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
c2d0: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
c2e0: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
c2f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c300: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
c310: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
c320: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
c330: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c340: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
c350: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
c360: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
c370: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
c380: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
c390: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
c3a0: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
c3b0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
c3c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
c3d0: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
c3e0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
c3f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
c400: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
c410: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
c420: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
c430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c440: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
c450: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
c460: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
c470: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
c480: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
c490: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
c4a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
c4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
c4c0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
c4d0: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
c4e0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
c4f0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
c500: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
c510: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
c520: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
c530: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
c540: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
c550: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
c560: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
c570: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
c580: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
c590: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
c5a0: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c5c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
c5d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
c5e0: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
c5f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
c600: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c610: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c620: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
c630: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
c640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
c650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c660: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c670: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
c680: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
c690: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c6a0: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
c6b0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
c6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c6d0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c6e0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
c700: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
c710: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
c720: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
c730: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c740: 6a 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  jfd) ){..    /* 
c750: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
c760: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
c770: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
c780: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
c790: 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
c7a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c7b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
c7c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
c7d0: 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73  EMORY );.      s
c7e0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c7f0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c800: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
c810: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c820: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c830: 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
c840: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
c850: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
c860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c870: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
c880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c890: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
c8a0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
c8b0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c8c0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c8d0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c8e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c8f0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c900: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
c910: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
c920: 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
c930: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c940: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c950: 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a  _PERSIST.    ){.
c960: 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a        rc = zeroJ
c970: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
c980: 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20  , hasMaster);.  
c990: 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
c9a0: 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
c9b0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c9c0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c9d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c9e0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c9f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
ca00: 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
ca10: 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
ca20: 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
ca30: 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
ca40: 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
ca50: 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
ca60: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
ca70: 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
ca80: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
ca90: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
caa0: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
cab0: 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
cac0: 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
cad0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
cae0: 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
caf0: 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
cb00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
cb10: 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  al.  */.      as
cb20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
cb30: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
cb40: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
cb50: 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
cb60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
cb70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
cb80: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
cb90: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
cba0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
cbb0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
cbc0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
cbd0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cbe0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cbf0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
cc00: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
cc10: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
cc20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
cc30: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
cc40: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
cc50: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
cc60: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
cc70: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
cc80: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
cc90: 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  f..    sqlite3Pc
cca0: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
ccb0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
ccc0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
ccd0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
cce0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ccf0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
cd00: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  nal = 0;.    pPa
cd10: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cd20: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cd30: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
cd40: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
cd50: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
cd60: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
cd70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cd80: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
cd90: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
cda0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cdb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cdc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
cdd0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
cde0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cdf0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
ce00: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
ce10: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
ce20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
ce30: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
ce40: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
ce50: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
ce60: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
ce70: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
ce80: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
ce90: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
cea0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ceb0: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
cec0: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
ced0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
cee0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
cef0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
cf00: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
cf10: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
cf20: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
cf30: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
cf40: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
cf50: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
cf60: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
cf70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
cf80: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
cf90: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
cfa0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
cfb0: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
cfc0: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
cfd0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
cfe0: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
cff0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
d000: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
d010: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
d020: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
d030: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
d040: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
d050: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
d060: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
d070: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
d080: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
d090: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
d0a0: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
d0b0: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
d0c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
d0d0: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
d0e0: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
d0f0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d100: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
d110: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
d120: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
d130: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
d140: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
d150: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
d160: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
d170: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
d180: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
d190: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
d1a0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
d1b0: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
d1c0: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d1d0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d1e0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d1f0: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
d200: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
d210: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
d220: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
d230: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
d240: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
d250: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
d260: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
d270: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
d280: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
d290: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
d2a0: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
d2b0: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
d2c0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
d2d0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
d2e0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
d2f0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
d300: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
d310: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d320: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d330: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d340: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d350: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d360: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d370: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
d380: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
d390: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d3a0: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
d3b0: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
d3c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d3d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
d3e0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d3f0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d400: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d420: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
d430: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d440: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
d450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
d460: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
d470: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
d480: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
d490: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
d4a0: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
d4b0: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
d4c0: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
d4d0: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
d4e0: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
d4f0: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
d500: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
d510: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d520: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
d530: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d540: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
d550: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
d560: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
d570: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d580: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
d590: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
d5a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
d5b0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
d5c0: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
d5d0: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
d5e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
d5f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
d600: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
d610: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
d620: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
d630: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d640: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d650: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
d660: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
d670: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
d680: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
d690: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
d6a0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d6b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
d6c0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
d6d0: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
d6e0: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
d6f0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
d700: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d710: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
d720: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
d730: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
d740: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
d750: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d760: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
d770: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
d780: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
d790: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
d7a0: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
d7b0: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
d7c0: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
d7d0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
d7e0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
d7f0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d800: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d810: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d820: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d830: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
d840: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
d850: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d860: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
d870: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
d880: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
d890: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
d8a0: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
d8b0: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
d8c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
d8d0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
d8e0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
d8f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
d900: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
d910: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
d920: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d930: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
d940: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
d950: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
d960: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
d970: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
d980: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
d990: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
d9a0: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
d9b0: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
d9c0: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
d9d0: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
d9e0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
d9f0: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
da00: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
da10: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
da20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
da30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
da40: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
da50: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
da60: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
da70: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
da80: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
da90: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
daa0: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
dab0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dac0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
dad0: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
dae0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
daf0: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
db00: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
db10: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
db20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
db30: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
db40: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
db50: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
db60: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
db70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
db80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
db90: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
dba0: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
dbb0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
dbc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dbd0: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
dbe0: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
dbf0: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
dc00: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
dc10: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
dc20: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
dc30: 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63  /.  int isUnsync
dc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
dc60: 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63  ding from unsync
dc70: 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ed main journal 
dc80: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
dc90: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
dca0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
dcb0: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
dcc0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  ck */.  int isSa
dcd0: 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20  vepnt,          
dce0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
dcf0: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
dd00: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  llback */.  Bitv
dd10: 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20  ec *pDone       
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
dd30: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
dd40: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
dd50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
dd60: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
dd90: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
dda0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
ddb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ddc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
ddd0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
dde0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
ddf0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
de20: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
de30: 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
de40: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
de50: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
de60: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
de70: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
de80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dea0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
deb0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
dec0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  nal file */..  a
ded0: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
dee0: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
def0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
df00: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
df10: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
df20: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
df30: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
df40: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
df50: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
df60: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
df70: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
df80: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
df90: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
dfa0: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
dfb0: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
dfc0: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
dfd0: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
dfe0: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
dff0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e000: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
e010: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
e020: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
e030: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
e040: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e050: 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
e060: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
e070: 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
e080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
e090: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
e0a0: 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
e0b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
e0c0: 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
e0d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
e0e0: 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
e0f0: 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
e100: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
e110: 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
e120: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
e130: 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
e140: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e150: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
e160: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
e170: 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
e180: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e190: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
e1a0: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
e1b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e1c0: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
e1d0: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
e1e0: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
e1f0: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
e200: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
e210: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
e220: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
e230: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
e240: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
e250: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
e260: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
e270: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
e280: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
e290: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
e2a0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
e2b0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
e2c0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e2d0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
e2e0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
e2f0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
e300: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
e310: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
e320: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
e330: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
e340: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
e350: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
e360: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
e370: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
e380: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e390: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
e3a0: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
e3b0: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
e3c0: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
e3d0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
e3e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e3f0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
e400: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
e410: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
e420: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
e430: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
e440: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e450: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
e460: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
e470: 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
e480: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
e490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e4a0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
e4b0: 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  }..  if( pDone &
e4c0: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
e4d0: 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
e4e0: 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
e4f0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
e500: 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
e510: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
e520: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
e530: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
e540: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
e550: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
e560: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
e570: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
e580: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
e590: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
e5a0: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
e5b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
e5c0: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
e5d0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
e5e0: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
e5f0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
e600: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e610: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
e620: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
e630: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
e640: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
e650: 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
e660: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
e670: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
e680: 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
e690: 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
e6a0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
e6b0: 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
e6c0: 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
e6d0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
e6e0: 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
e6f0: 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
e700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
e710: 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
e720: 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
e730: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
e740: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
e750: 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
e760: 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
e770: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
e780: 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
e790: 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
e7a0: 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
e7b0: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
e7c0: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
e7d0: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
e7e0: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
e7f0: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
e800: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
e810: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
e820: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
e830: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
e840: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
e850: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e860: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
e870: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
e880: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
e890: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
e8a0: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
e8b0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
e8c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
e8d0: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
e8e0: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
e8f0: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
e900: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
e910: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
e920: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
e930: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
e940: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
e950: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
e960: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
e970: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
e980: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
e990: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
e9a0: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
e9b0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
e9c0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
e9d0: 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
e9e0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
e9f0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
ea00: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
ea10: 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
ea20: 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
ea30: 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
ea40: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ea50: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
ea60: 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
ea70: 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
ea80: 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
ea90: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
eaa0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
eab0: 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
eac0: 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
ead0: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
eae0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
eaf0: 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
eb00: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
eb10: 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
eb20: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
eb30: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
eb40: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
eb50: 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
eb60: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
eb70: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
eb80: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
eb90: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
eba0: 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
ebb0: 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
ebc0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
ebd0: 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
ebe0: 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
ebf0: 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
ec00: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
ec10: 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
ec20: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
ec30: 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
ec40: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
ec50: 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
ec60: 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
ec70: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
ec80: 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
ec90: 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
eca0: 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
ecb0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
ecc0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
ecd0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
ece0: 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
ecf0: 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
ed00: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
ed10: 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
ed20: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
ed30: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
ed40: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
ed50: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
ed60: 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
ed70: 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
ed80: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
ed90: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
eda0: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
edb0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
edc0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
edd0: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
ede0: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
edf0: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
ee00: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73  _SYNC)).   && is
ee10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
ee20: 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63  .   && !isUnsync
ee30: 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
ee40: 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
ee50: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
ee60: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
ee70: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ee80: 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
ee90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
eea0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
eeb0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
eec0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
eed0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
eee0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
eef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef00: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
ef10: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
ef20: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
ef30: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
ef40: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
ef50: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
ef60: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
ef70: 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
ef80: 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
ef90: 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
efa0: 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
efb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
efc0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
efd0: 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
efe0: 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
eff0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f000: 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
f010: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
f020: 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
f030: 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
f040: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
f050: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f060: 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
f070: 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
f080: 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
f090: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
f0a0: 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
f0b0: 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
f0c0: 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
f0d0: 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
f0e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f0f0: 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
f100: 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
f110: 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
f120: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
f130: 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
f140: 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
f150: 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
f160: 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
f170: 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
f180: 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
f190: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
f1a0: 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
f1b0: 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
f1c0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
f1d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
f1e0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
f1f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f200: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
f210: 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
f220: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
f230: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
f240: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
f250: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
f260: 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
f270: 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
f280: 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
f290: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
f2a0: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
f2b0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
f2c0: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
f2d0: 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
f2e0: 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
f2f0: 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
f300: 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
f310: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
f320: 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
f330: 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
f340: 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
f350: 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
f360: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
f370: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  t );.    if( (rc
f380: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
f390: 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
f3a0: 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d  gno, &pPg, 1))!=
f3b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f3c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f3d0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61    }.    pPg->fla
f3e0: 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
f3f0: 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
f400: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
f410: 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
f420: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
f430: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
f440: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
f450: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
f460: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
f470: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
f480: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
f490: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
f4a0: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
f4b0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
f4c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
f4d0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
f4e0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
f4f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
f500: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
f510: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
f520: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
f530: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
f540: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
f550: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
f560: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
f570: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
f580: 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
f590: 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
f5a0: 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
f5b0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f5c0: 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
f5d0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
f5e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69  );.    if( isMai
f5f0: 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
f600: 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
f610: 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
f620: 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
f630: 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
f640: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
f650: 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
f660: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
f670: 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
f680: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
f690: 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
f6a0: 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
f6b0: 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
f6c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f6d0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
f6e0: 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
f6f0: 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
f700: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
f710: 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
f720: 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
f730: 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
f740: 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a  to the..      **
f750: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
f760: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
f770: 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
f780: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
f790: 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
f7a0: 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
f7b0: 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
f7c0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
f7d0: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
f7e0: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
f7f0: 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
f800: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
f810: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
f820: 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
f830: 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
f840: 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
f850: 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
f860: 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
f870: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
f880: 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
f890: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
f8a0: 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
f8b0: 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
f8c0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
f8d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
f8e0: 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
f8f0: 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
f900: 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
f910: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f920: 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
f930: 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
f940: 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
f950: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
f960: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
f970: 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
f980: 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
f990: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
f9a0: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
f9b0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
f9c0: 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
f9d0: 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
f9e0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
f9f0: 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
fa00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
fa10: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
fa20: 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
fa30: 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
fa40: 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
fa50: 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
fa60: 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
fa70: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
fa80: 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
fa90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
faa0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
fab0: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
fac0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
fad0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
fae0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
faf0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
fb00: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
fb10: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
fb20: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
fb30: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
fb40: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
fb50: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
fb60: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
fb70: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
fb80: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
fb90: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
fba0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
fbb0: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
fbc0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
fbd0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
fbe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fbf0: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
fc00: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
fc10: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
fc20: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
fc30: 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
fc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
fc50: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
fc60: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
fc70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc80: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
fc90: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
fca0: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
fcb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fcc0: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
fcd0: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
fce0: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
fcf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fd00: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
fd10: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
fd20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
fd30: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
fd40: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
fd50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fd60: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
fd70: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
fd80: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
fd90: 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
fda0: 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
fdb0: 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
fdc0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
fdd0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
fde0: 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
fdf0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
fe00: 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
fe10: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
fe20: 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
fe30: 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
fe40: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
fe50: 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
fe60: 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
fe70: 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
fe80: 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
fe90: 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
fea0: 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
feb0: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
fec0: 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
fed0: 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
fee0: 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
fef0: 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
ff00: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
ff10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
ff20: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
ff30: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
ff40: 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
ff50: 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
ff60: 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
ff70: 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
ff80: 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
ff90: 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
ffa0: 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
ffb0: 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
ffc0: 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
ffd0: 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
ffe0: 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
fff0: 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10000 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10010 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10020 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10030 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10040 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10050 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10060 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10070 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10080 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
10090 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
100a0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
100b0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
100c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
100d0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
100e0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
100f0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10100 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10110 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10120 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10130 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10140 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10150 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10160 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10170 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10180 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
101a0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
101b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
101c0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
101d0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
101e0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
101f0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10200 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10210 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10220 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10230 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10240 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10250 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10260 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10270 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10280 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10290 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
102a0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
102b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
102c0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
102d0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
102e0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
102f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10300 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10310 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10320 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10330 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10340 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10350 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10360 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10370 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10380 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10390 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
103a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
103b0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
103c0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
103d0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
103e0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
103f0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10400 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10410 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10420 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10430 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10440 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10450 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10460 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10470 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
104a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
104b0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
104c0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
104d0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
104e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
104f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10500 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10510 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10520 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10530 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10540 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10550 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10560 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10570 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10580 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10590 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
105a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105b0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
105c0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
105d0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
105e0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
105f0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10600 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10610 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10620 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10630 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10640 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10660 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10670 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10680 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10690 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
106a0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
106b0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
106c0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
106d0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
106e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
106f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10700 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
10710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10720 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10730 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
10740 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10750 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
10760 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
10770 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
10780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10790 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
107a0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
107b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
107c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
107d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
107e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
107f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10800 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
10810 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
10820 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
10830 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
10840 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
10850 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
10860 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
10870 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
10880 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
10890 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108a0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
108b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
108c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
108d0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
108e0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
108f0 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
10900 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
10910 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
10920 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
10930 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
10940 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 20 20 69  rPtr + 1);.    i
10950 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
10960 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
10970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10980 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10990 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
109a0 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
109b0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
109c0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
109d0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
109e0 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
109f0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
10a00 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
10a10 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
10a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10a30 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10a40 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73  er_out;.    zMas
10a50 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
10a60 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
10a70 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
10a80 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
10a90 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
10aa0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
10ab0 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
10ac0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
10ad0 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
10ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10af0 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
10b00 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
10b10 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
10b20 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
10b30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10b40 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
10b50 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
10b60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
10b70 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
10b80 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
10b90 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
10ba0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
10bb0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
10bc0 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
10bd0 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
10be0 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
10bf0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
10c00 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
10c10 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
10c20 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
10c30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10c40 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
10c50 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
10c60 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
10c70 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
10c80 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
10c90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
10ca0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
10cb0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
10cc0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
10cd0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
10ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
10cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10d00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
10d10 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10d20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
10d30 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
10d40 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
10d50 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
10d60 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
10d70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
10d80 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
10d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10db0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
10dc0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
10dd0 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
10de0 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
10df0 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
10e00 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
10e10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10e30 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
10e40 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
10e50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e60 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
10e70 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10e80 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
10e90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10ea0 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
10eb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
10ec0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
10ed0 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
10ee0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10ef0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
10f00 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
10f10 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
10f20 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
10f30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
10f40 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
10f50 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72    .  if( pMaster
10f60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10f70 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
10f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
10f90 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
10fa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10fb0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
10fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10fd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10fe0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
10ff0 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
11000 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11010 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
11020 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11030 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
11040 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
11050 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11060 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
11070 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
11080 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
11090 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
110a0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
110b0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
110c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
110d0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
110e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
110f0 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
11100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11110 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
11120 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
11130 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
11140 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
11150 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
11160 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
11170 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
11180 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
11190 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
111a0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
111b0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
111c0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
111d0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
111e0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
111f0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
11200 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
11210 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
11220 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
11230 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
11240 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
11250 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
11260 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
11270 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
11280 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
11290 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
112a0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
112b0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
112c0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
112d0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
112e0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
112f0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
11300 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
11310 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
11320 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
11330 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11340 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
11350 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
11360 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
11370 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
11380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
11390 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
113a0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
113b0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
113c0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
113d0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
113e0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
113f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11400 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
11410 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
11420 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
11430 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
11440 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
11450 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
11460 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
11470 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
11480 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
11490 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
114a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
114b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
114c0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
114d0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
114e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
114f0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
11500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11510 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
11520 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
11530 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
11540 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
11550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11560 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11570 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
11580 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
115a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
115b0 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
115c0 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
115d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
11600 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11620 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11630 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11640 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
11650 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
11660 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
11670 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
11680 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
11690 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
116a0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
116b0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
116c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
116d0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
116e0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
116f0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
11700 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
11710 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
11720 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
11730 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
11740 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
11750 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
11760 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
11770 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
11780 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
11790 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
117a0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
117b0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
117c0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
117d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
117e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
117f0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
11800 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
11810 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
11820 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
11830 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
11840 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
11850 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
11860 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
11870 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
11880 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
11890 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
118a0 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
118b0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
118c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
118d0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
118e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
118f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
11900 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
11910 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11920 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
11930 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
11940 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
11950 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
11960 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11970 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
11980 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
11990 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
119a0 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
119b0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
119c0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
119d0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
119e0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
119f0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
11a00 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
11a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
11a20 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
11a30 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11a40 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
11a50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11a60 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
11a70 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
11a80 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
11a90 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
11aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
11ab0 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
11ac0 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
11ad0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
11ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
11af0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
11b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11b10 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
11b20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
11b30 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
11b40 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
11b50 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
11b60 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
11b70 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
11b80 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
11b90 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
11ba0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
11bb0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
11bc0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
11bd0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
11be0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
11bf0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
11c00 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
11c10 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
11c20 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
11c30 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
11c40 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
11c50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
11c60 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
11c70 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
11c80 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
11c90 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
11ca0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
11cb0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
11cc0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
11cd0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
11ce0 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
11cf0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
11d00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11d10 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
11d20 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
11d30 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
11d40 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
11d50 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
11d60 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
11d70 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
11d80 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
11d90 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
11da0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
11db0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
11dc0 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
11dd0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
11de0 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
11df0 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
11e00 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
11e10 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
11e20 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
11e30 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
11e40 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
11e50 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
11e60 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
11e70 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
11e80 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
11e90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11ea0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
11eb0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
11ec0 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
11ed0 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
11ee0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
11ef0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
11f00 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
11f10 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
11f20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
11f30 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
11f40 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
11f50 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
11f60 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
11f70 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
11f80 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
11f90 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
11fa0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
11fb0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
11fc0 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
11fd0 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
11fe0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
11ff0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
12000 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
12020 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
12030 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
12040 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
12050 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
12060 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
12070 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
12080 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
12090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
120a0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
120b0 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
120c0 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
120d0 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
120e0 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
120f0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
12100 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
12110 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
12120 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
12130 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
12140 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
12150 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
12160 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
12170 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
12180 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
12190 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
121a0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
121b0 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
121c0 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
121d0 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
121e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
121f0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
12200 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
12210 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
12220 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
12230 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
12240 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
12250 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
12260 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
12270 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
12280 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
12290 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
122a0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
122b0 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
122c0 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
122d0 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
122e0 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
122f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
12300 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
12310 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
12320 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
12330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
12340 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
12350 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
12360 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
12370 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
12380 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
12390 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
123a0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
123b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
123c0 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
123d0 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
123e0 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
123f0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
12400 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
12410 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
12420 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
12430 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
12440 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
12450 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
12460 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
12470 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
12480 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12490 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
124a0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
124b0 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
124c0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
124d0 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
124e0 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
124f0 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
12500 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
12510 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
12520 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
12530 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
12540 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
12550 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12560 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
12570 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
12580 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
12590 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
125a0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
125b0 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
125c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
125d0 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
125e0 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
125f0 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
12600 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
12610 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
12620 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
12630 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12640 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
12650 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
12680 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
12690 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
126a0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
126b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
126c0 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
126d0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
126e0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
126f0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
12700 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
12710 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
12720 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
12730 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
12740 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
12750 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
12780 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
12790 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127b0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
127c0 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
127d0 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
127e0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
127f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
12800 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12810 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
12820 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
12830 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
12840 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
12850 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
12860 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
12870 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12880 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
12890 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
128a0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
128b0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
128c0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
128d0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
128e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
128f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12900 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
12910 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
12920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12930 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
12940 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
12950 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
12960 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
12970 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
12980 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
12990 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
129a0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
129b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
129c0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
129d0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
129e0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
129f0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
12a00 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
12a10 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
12a20 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
12a30 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
12a40 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
12a50 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
12a60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
12a70 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
12a80 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
12a90 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
12aa0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
12ab0 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
12ac0 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
12ad0 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
12ae0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
12af0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
12b00 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
12b10 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
12b20 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
12b30 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
12b40 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
12b50 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
12b60 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
12b70 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
12b80 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
12b90 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
12ba0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
12bb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
12bc0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
12bd0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
12be0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
12bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12c00 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
12c10 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
12c20 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
12c30 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
12c40 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
12c50 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
12c60 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
12c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12c80 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
12c90 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12ca0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
12cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12cc0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
12cd0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
12ce0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
12cf0 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
12d00 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
12d10 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
12d20 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
12d30 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
12d40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
12d50 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
12d60 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
12d70 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
12d80 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79  {.    int isUnsy
12d90 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
12da0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
12db0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
12dc0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
12dd0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
12de0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
12df0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
12e00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
12e10 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
12e20 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
12e30 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
12e40 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
12e50 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
12e60 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
12e70 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
12e80 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
12e90 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
12ea0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
12eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
12ec0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12ed0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
12ee0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
12ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
12f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12f20 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
12f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f50 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12f60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12f70 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
12f80 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
12f90 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
12fa0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
12fb0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
12fc0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
12fd0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
12fe0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
12ff0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
13000 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
13010 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
13020 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
13030 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
13040 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
13050 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
13060 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
13070 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
13080 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
13090 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
130a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
130b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
130c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
130d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
130e0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
130f0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
13100 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
13110 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
13120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
13130 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
13140 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
13150 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
13160 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
13170 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
13180 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
13190 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
131a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
131b0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
131c0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
131d0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
131e0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
131f0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
13200 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
13210 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
13220 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
13230 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
13240 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
13250 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
13260 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
13270 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
13280 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
13290 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
132a0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
132b0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
132c0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
132d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
132e0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
132f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
13300 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
13310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
13320 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
13330 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
13340 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
13350 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
13360 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
13370 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
13380 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
13390 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
133a0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
133b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
133c0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
133d0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
133e0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
133f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13400 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
13410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
13420 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
13430 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
13440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13450 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
13460 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
13470 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
13480 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13490 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
134a0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
134b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
134c0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
134d0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
134e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
134f0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
13500 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13510 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31      isUnsync = 1
13520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13530 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
13540 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
13550 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13560 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
13570 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13580 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
13590 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
135a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
135b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
135c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
135d0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
135e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
135f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
13600 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
13610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13620 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
13630 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13640 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
13650 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
13660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13670 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
13680 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
13690 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
136a0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
136b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
136c0 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
136d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
136e0 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
136f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
13700 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
13710 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
13720 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
13730 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
13740 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
13750 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13760 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
13770 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e  ge(pPager,1,isUn
13780 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  sync,&pPager->jo
13790 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20  urnalOff,0,0);. 
137a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
137b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
137c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
137d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
137e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
137f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
13800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13810 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
13820 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13840 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
13850 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13860 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
13870 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
13880 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
13890 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
138a0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
138b0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
138c0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
138d0 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
138e0 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
138f0 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
13900 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
13910 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
13920 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
13930 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
13940 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
13950 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13960 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
13970 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13980 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13990 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
139a0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
139b0 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
139c0 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
139d0 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
139e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
139f0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
13a00 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
13a10 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
13a20 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
13a30 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
13a40 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
13a50 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
13a60 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
13a70 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
13a80 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
13a90 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
13aa0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
13ab0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
13ac0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
13ad0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
13ae0 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
13af0 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
13b00 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
13b10 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
13b20 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
13b30 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
13b40 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
13b50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
13b60 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
13b70 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
13b80 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
13b90 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
13ba0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
13bb0 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
13bc0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
13bd0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
13be0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
13bf0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
13c00 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
13c10 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
13c20 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
13c30 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
13c40 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
13c50 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
13c60 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
13c70 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
13c80 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
13c90 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
13ca0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
13cb0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
13cc0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
13cd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
13ce0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
13cf0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
13d00 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
13d10 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
13d20 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
13d30 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
13d40 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
13d50 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
13d60 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
13d70 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
13d80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
13d90 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
13da0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13db0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
13dc0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
13dd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13de0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
13df0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13e00 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
13e10 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
13e20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
13e30 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
13e40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13e50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
13e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13e70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
13e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e90 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
13ea0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
13eb0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
13ec0 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
13ed0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13ee0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
13ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13f00 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
13f10 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
13f20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
13f30 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
13f40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13f50 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
13f60 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
13f70 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
13f80 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13f90 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
13fa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
13fb0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
13fc0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
13fd0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13ff0 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
14000 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
14010 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
14020 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
14030 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
14040 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
14050 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
14060 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
14070 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
14080 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
14090 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
140a0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
140b0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
140c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
140d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
140e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
140f0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
14100 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
14110 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
14120 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
14130 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
14140 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
14150 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
14160 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
14170 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
14180 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
14190 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
141a0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
141b0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
141c0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
141d0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
141e0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
141f0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
14200 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
14210 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14220 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
14230 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
14240 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
14250 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
14260 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
14270 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
14280 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
14290 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
142a0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
142b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
142c0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
142d0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
142e0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
142f0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
14300 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
14310 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14320 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
14330 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
14340 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14350 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
14360 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14370 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
14380 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
14390 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
143a0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
143b0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
143c0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
143d0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
143e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
143f0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
14400 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
14410 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
14420 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14430 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
14440 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14450 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
14460 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
14470 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
14480 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14490 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
144a0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
144b0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
144c0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
144d0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
144e0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
144f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
14500 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
14510 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
14520 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
14530 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
14540 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
14550 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14560 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
14570 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
14580 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
14590 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
145a0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
145b0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
145c0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
145d0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
145e0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
145f0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
14600 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
14610 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
14620 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
14630 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
14640 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
14650 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14660 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
14670 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
14680 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
14690 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
146a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
146b0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
146c0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
146d0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
146e0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
146f0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
14700 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
14710 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
14720 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
14730 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
14740 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
14750 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
14760 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
14770 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
14780 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
14790 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
147a0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
147b0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
147c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
147d0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
147e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
147f0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
14800 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
14810 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
14820 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
14830 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
14840 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
14850 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
14860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
14870 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
14880 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
14890 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
148a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
148b0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
148c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
148d0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
148e0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
148f0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
14900 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
14910 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
14920 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14930 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
14940 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14950 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
14960 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
14970 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
14980 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
14990 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
149a0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
149b0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
149c0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
149d0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
149e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
149f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14a00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
14a10 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
14a20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
14a30 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
14a40 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
14a50 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
14a60 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
14a70 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
14a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
14a90 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
14aa0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
14ab0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
14ac0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
14ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
14ae0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
14af0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
14b00 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
14b10 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
14b20 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
14b30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
14b40 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
14b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14b60 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
14b70 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14b80 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
14b90 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
14ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
14bb0 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
14bc0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
14bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14be0 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ff;..  /* Begin 
14bf0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
14c00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
14c10 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
14c20 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
14c30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
14c40 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
14c50 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
14c60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
14c70 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
14c80 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
14c90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ca0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
14cb0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
14cc0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
14cd0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
14ce0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
14cf0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
14d00 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
14d10 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
14d20 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
14d30 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
14d40 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
14d50 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
14d60 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
14d70 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  t ){.    iHdrOff
14d80 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
14d90 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
14da0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
14db0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
14dc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14dd0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
14de0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
14df0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
14e00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14e10 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
14e20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14e30 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
14e40 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
14e50 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
14e60 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
14e70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14e80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
14e90 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
14ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
14eb0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
14ec0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
14ed0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
14ee0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
14ef0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
14f00 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
14f10 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
14f20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
14f30 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
14f40 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
14f50 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
14f60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14f70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
14f80 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
14f90 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
14fa0 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
14fb0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
14fc0 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
14fd0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
14fe0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
15000 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
15010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15030 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
15040 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
15050 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
15060 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
15070 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
15080 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
15090 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
150a0 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
150b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
150c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
150d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
150e0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
150f0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15100 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
15120 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
15130 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
15140 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
15150 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
15160 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
15170 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
15180 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
15190 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
151a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
151b0 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
151c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
151d0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
151e0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
151f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
15200 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
15210 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
15220 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15230 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
15240 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
15250 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
15260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15270 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
15280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15290 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
152a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
152b0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152c0 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
152d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
152e0 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
152f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15300 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
15310 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
15330 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15340 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff==szJ );..  
15350 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
15360 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
15370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15380 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
15390 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
153a0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
153b0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
153c0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
153d0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
153e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
153f0 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
15400 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
15410 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
15420 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
15430 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
15440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15450 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15460 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
15470 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
15480 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
15490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72  geSize);.    for
154a0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
154b0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
154c0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
154d0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
154e0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
154f0 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34  t( offset==ii*(4
15500 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
15510 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
15520 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15530 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15540 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20   0, 0, &offset, 
15550 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
15560 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15570 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15580 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
15590 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
155a0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
155b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
155c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
155d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72  f = szJ;.  }.  r
155e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
155f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
15600 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
15610 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
15620 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
15630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15640 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
15650 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15660 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15670 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
15680 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
15690 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
156a0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
156b0 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
156c0 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
156d0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
156e0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
156f0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
15700 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
15710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
15720 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
15730 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
15740 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
15750 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
15760 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
15770 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
15780 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
15790 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
157a0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
157b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
157c0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
157d0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
157e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
157f0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
15800 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
15810 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
15820 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
15830 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
15840 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
15850 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
15860 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
15870 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15880 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
15890 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
158a0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
158b0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
158c0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
158d0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
158e0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
158f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
15910 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
15920 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
15930 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
15940 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
15950 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
15960 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
15970 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
15980 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
15990 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
159a0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
159b0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
159c0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
159d0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
159e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
159f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
15a00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15a10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
15a20 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
15a30 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
15a40 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
15a50 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
15a60 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
15a70 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15a90 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
15aa0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
15ab0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
15ac0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
15ad0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
15ae0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
15af0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
15b00 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
15b10 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
15b20 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
15b30 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
15b40 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
15b50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
15b60 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
15b70 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
15b80 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
15b90 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
15ba0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
15bb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15bc0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
15bd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15be0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
15bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15c00 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
15c10 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
15c20 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
15c30 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
15c40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
15c50 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
15c60 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
15c70 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
15c80 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
15c90 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
15ca0 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
15cb0 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
15cc0 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
15cd0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
15ce0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
15cf0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15d00 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
15d10 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
15d20 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
15d30 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
15d40 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
15d50 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
15d60 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
15d70 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
15d80 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
15d90 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
15da0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
15db0 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
15dc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15dd0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
15de0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
15df0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
15e00 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
15e10 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
15e20 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
15e30 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
15e40 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
15e50 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
15e60 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
15e70 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
15e80 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
15e90 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
15ea0 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
15eb0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
15ec0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
15ed0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
15ee0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
15ef0 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
15f00 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
15f10 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
15f20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
15f30 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
15f40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15f50 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
15f60 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
15f70 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
15f80 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
15f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
15fa0 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
15fb0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
15fc0 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
15fd0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
15fe0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
15ff0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
16000 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16010 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16020 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
16030 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
16040 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
16050 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
16060 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
16070 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
16080 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
16090 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
160a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
160b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
160c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
160d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
160e0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
160f0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
16100 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
16110 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
16120 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
16130 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16140 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16150 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
16160 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16170 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
16180 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
16190 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
161a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
161b0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
161c0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
161d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
161e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
161f0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
16200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16210 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
16220 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
16230 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
16240 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
16250 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
16260 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
16270 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
16280 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
16290 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
162a0 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
162b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
162c0 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
162d0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
162e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
162f0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
16300 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
16310 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
16320 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
16330 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
16340 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
16350 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
16360 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
16370 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
16380 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
16390 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
163a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
163b0 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
163c0 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
163f0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
16400 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
16440 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
16450 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
16460 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
16470 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16480 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
16490 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
164a0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
164b0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
164c0 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
164d0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
164e0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
164f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
16500 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
16510 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
16520 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
16530 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
16540 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
16550 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
16560 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
16570 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
16580 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
16590 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
165a0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
165b0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
165c0 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
165d0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
16600 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
16610 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
16620 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16630 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
16640 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
16650 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
16660 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
16670 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
16680 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
16690 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
166a0 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
166b0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
166c0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
166d0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
166e0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
166f0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
16700 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
16710 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
16720 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16730 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
16740 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
16750 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16760 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
16770 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
16780 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
16790 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
167a0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
167b0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
167c0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
167d0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
167e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
167f0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16810 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
16820 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
16830 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
16840 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
16850 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
16860 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
16870 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
16880 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
16890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
168a0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
168b0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
168c0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
168d0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
168e0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
168f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16900 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
16910 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
16920 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
16930 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
16940 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16950 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
16960 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
16970 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
16980 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
16990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
169a0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
169b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
169c0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
169d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
169e0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
169f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
16a00 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
16a10 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
16a20 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
16a30 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
16a40 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
16a50 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
16a60 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
16a70 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
16a80 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
16a90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
16aa0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
16ab0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
16ac0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
16ad0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16ae0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
16af0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
16b00 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
16b10 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
16b20 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
16b30 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
16b40 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
16b50 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
16b60 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
16b70 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
16b80 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
16b90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
16ba0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
16bb0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
16bc0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
16bd0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
16be0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
16bf0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
16c00 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
16c10 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16c20 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
16c30 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
16c40 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
16c50 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
16c60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16c70 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
16c80 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
16c90 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
16ca0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
16cb0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
16cc0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
16cd0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
16ce0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
16cf0 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
16d00 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
16d10 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
16d20 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
16d30 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
16d40 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
16d50 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
16d60 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
16d70 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
16d80 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
16d90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
16db0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
16dc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
16dd0 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  16 *pPageSize, i
16de0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
16df0 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
16e00 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
16e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16e20 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
16e30 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
16e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
16e50 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
16e60 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
16e70 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
16e80 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
16e90 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
16ea0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
16eb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
16ec0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
16ed0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
16ee0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
16ef0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65  =0 .     && page
16f00 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
16f10 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
16f20 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
16f30 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
16f40 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
16f50 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
16f60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
16f70 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
16f80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16fa0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
16fb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
16fc0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
16fd0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
16fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
16ff0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
17000 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
17010 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
17020 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
17030 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17040 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
17050 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
17060 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17070 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
17080 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
17090 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
170a0 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
170b0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
170c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
170d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
170e0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
170f0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
17100 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
17110 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
17120 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
17130 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
17140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17160 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17170 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
17180 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
17190 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
171a0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
171b0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
171c0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
171d0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
171e0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
171f0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
17200 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
17210 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
17220 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
17230 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
17240 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
17250 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
17260 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
17270 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
17280 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
17290 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
172a0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
172b0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
172c0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
172d0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
172e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
172f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
17300 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
17310 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17320 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
17330 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
17340 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
17350 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
17360 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
17370 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
17380 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
17390 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
173a0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
173b0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
173c0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
173d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
173e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
173f0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
17400 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
17410 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
17420 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
17430 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17440 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
17450 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
17460 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
17470 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
17480 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
17490 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
174a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
174b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
174c0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
174d0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
174e0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
174f0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
17500 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
17510 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
17520 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
17530 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
17540 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
17550 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
17560 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
17570 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
17580 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
17590 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
175a0 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
175b0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
175c0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
175d0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
175e0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
175f0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
17600 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
17610 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17620 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
17630 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17640 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
17650 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
17660 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
17670 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17680 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
17690 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
176a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
176b0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
176c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
176d0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
176e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
176f0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
17700 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
17710 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
17720 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
17730 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
17740 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17750 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
17760 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
17770 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
17780 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
17790 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
177a0 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
177b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
177c0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
177d0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
177e0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
177f0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
17800 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
17810 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
17820 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
17830 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
17840 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
17850 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
17860 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
17870 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
17880 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
17890 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
178a0 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
178b0 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
178c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
178d0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
178e0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
178f0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
17900 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
17910 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
17920 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
17930 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
17940 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
17950 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
17960 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
17970 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
17980 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
17990 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
179a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
179b0 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
179c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
179d0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
179e0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
179f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
17a00 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
17a10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17a20 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
17a30 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
17a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17a50 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
17a60 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
17a70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17a80 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
17a90 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66  tempFile );.  if
17aa0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17ab0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
17ac0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
17ad0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
17ae0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
17af0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
17b00 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
17b10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
17b20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
17b30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
17b40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
17b80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
17b90 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
17ba0 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
17bb0 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
17bc0 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
17bd0 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
17be0 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
17bf0 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
17c00 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
17c10 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
17c20 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
17c30 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
17c40 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
17c50 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
17c60 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
17c70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17c80 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
17c90 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17ca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17cb0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
17cc0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
17cd0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17ce0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
17cf0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
17d00 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
17d10 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
17d20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
17d30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
17d40 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
17d50 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
17d60 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
17d70 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
17d80 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
17d90 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
17da0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
17db0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
17dc0 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
17dd0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
17de0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
17df0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
17e00 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
17e10 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
17e20 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17e30 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
17e40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17e50 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
17e60 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
17e70 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e90 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
17ea0 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
17eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
17ec0 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69  ger is already i
17ed0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
17ee0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
17ef0 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69  ror code. */.  i
17f00 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17f10 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
17f20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
17f40 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
17f50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17f60 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
17f70 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
17f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
17f90 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
17fa0 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
17fb0 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
17fc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fe0 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
17ff0 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
18000 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18020 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
18030 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
18040 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
18050 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
18060 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18070 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18080 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
18090 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
180a0 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
180b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
180c0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
180d0 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61  n))) ){.      pa
180e0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
180f0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
18100 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18110 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
18120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18130 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
18140 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
18150 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
18160 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
18170 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18180 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18190 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
181a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
181b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
181c0 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
181d0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
181e0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
181f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18200 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
18210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
18220 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
18230 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
18240 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
18250 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
18260 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
18270 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
18280 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
18290 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
182a0 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
182b0 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
182c0 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
182d0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
182e0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
182f0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
18300 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
18310 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
18320 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
18330 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20  ITE_OK */.  if( 
18340 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  pnPage ){.    *p
18350 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
18360 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18370 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
18380 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
18390 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
183a0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
183b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
183c0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
183d0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
183e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
183f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
18400 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
18410 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
18420 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
18430 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
18440 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
18450 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
18460 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
18470 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
18480 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
18490 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
184a0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
184b0 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
184c0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
184d0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
184e0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
184f0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
18500 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
18510 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
18520 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18530 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
18540 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
18550 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
18560 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
18570 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
18580 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
18590 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
185a0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
185b0 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
185c0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
185d0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
185e0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
185f0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
18600 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
18610 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18640 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
18650 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
18660 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
18670 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
18680 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
18690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
186a0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
186b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
186c0 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
186d0 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
186e0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
186f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
18700 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18710 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18720 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
18730 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
18740 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
18750 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a   unknown. It.  *
18760 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  * must not have 
18770 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
18780 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
18790 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
187a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
187b0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
187c0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
187d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
187e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
187f0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
18800 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
18810 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
18820 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
18830 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
18840 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
18850 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
18860 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
18870 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
18880 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
18890 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
188a0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
188b0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
188c0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
188d0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
188e0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
188f0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
18900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18910 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
18920 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
18930 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61   || (pPager->sta
18940 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18950 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
18960 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
18970 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
18980 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
18990 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65  RVED && locktype
189a0 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
189b0 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  E).  );..  if( p
189c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
189d0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
189e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
189f0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
18a00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18a10 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
18a20 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
18a30 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
18a40 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
18a50 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
18a60 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
18a70 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
18a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28  Pager->state = (
18ab0 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  u8)locktype;.   
18ac0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
18ad0 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
18ae0 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
18af0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18b00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
18b10 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
18b20 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
18b30 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
18b40 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
18b50 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
18b60 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
18b70 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
18b80 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
18b90 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
18ba0 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
18bb0 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
18bc0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
18bd0 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
18be0 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
18bf0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
18c00 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
18c10 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
18c20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
18c30 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
18c40 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
18c50 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
18c60 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
18c70 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
18c80 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
18c90 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
18ca0 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
18cb0 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
18cc0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
18cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
18ce0 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
18cf0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
18d00 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
18d10 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
18d20 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
18d30 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
18d40 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
18d50 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
18d60 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
18d70 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
18d80 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
18d90 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
18da0 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
18db0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
18dc0 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
18dd0 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
18de0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
18df0 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
18e00 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
18e10 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20  aviour would be 
18e20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
18e30 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
18e40 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
18e50 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
18e60 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
18e70 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
18e80 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
18e90 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
18ea0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
18eb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
18ec0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
18ed0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
18ee0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
18ef0 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
18f00 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
18f10 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
18f20 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
18f30 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
18f40 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
18f50 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
18f60 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
18f70 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
18f80 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
18f90 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
18fa0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
18fb0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
18fc0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
18fd0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
18fe0 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
18ff0 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
19000 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
19010 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
19020 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
19030 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
19040 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
19050 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
19060 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
19070 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
19080 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
19090 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
190a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
190b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
190c0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
190d0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
190e0 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
190f0 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
19100 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
19110 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
19120 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
19130 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
19140 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
19150 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
19160 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
19170 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
19180 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
19190 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
191a0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
191b0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
191c0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
191d0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
191e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
191f0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
19200 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19210 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
19220 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19230 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
19240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19250 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
19260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19270 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
19280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19290 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
192a0 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
192b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
192c0 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e  ge;.  assertTrun
192d0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
192e0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
192f0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
19300 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
19310 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
19320 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
19330 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
19340 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
19350 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
19360 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19370 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
19380 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
19390 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
193a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
193b0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
193c0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
193d0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
193e0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
193f0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19400 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
19410 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
19420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19430 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
19440 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
19450 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
19460 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19470 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
19480 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19490 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
194a0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
194b0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
194c0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
194d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
194e0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
194f0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19500 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
19510 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
19520 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19530 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
19540 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
19550 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
19560 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19570 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
19580 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
19590 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
195a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
195b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
195c0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
195d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
195e0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
195f0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19600 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
19610 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
19620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19630 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
19640 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
19650 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
19660 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19670 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
19680 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
19690 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
196a0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
196b0 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
196c0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
196d0 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
196e0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
196f0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19700 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
19710 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
19720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19730 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
19740 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
19750 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
19760 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19770 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19780 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19790 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
197a0 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
197b0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
197c0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
197d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
197e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
197f0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19800 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19810 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
19820 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
19830 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
19840 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
19850 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
19860 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19870 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19880 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19890 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
198a0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
198b0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
198c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
198d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
198e0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
198f0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
19900 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
19910 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
19920 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
19930 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19940 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
19950 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
19960 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
19970 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
19980 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
19990 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
199a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
199b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
199c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
199d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
199e0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
199f0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
19a00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19a10 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
19a20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
19a30 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
19a40 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
19a50 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
19a60 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
19a70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
19a80 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
19a90 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
19aa0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
19ab0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
19ac0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
19ad0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
19ae0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
19af0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
19b00 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19b10 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
19b20 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
19b30 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
19b40 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
19b50 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
19b60 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
19b70 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
19b80 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
19b90 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
19ba0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
19bb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
19bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
19bd0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
19be0 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e  is not set, then
19bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19c00 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
19c10 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
19c20 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
19c30 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
19c40 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20  nal-mode.** and 
19c50 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
19c60 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
19c70 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
19c80 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
19c90 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19cb0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
19cc0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
19cd0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
19ce0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
19cf0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
19d00 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
19d10 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
19d20 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
19d30 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
19d40 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
19d50 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
19d60 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
19d70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
19d80 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
19d90 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
19da0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
19db0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
19dc0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
19dd0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
19de0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
19df0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
19e00 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
19e10 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
19e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19e30 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
19e40 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
19e50 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
19e60 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
19e70 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19e80 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
19e90 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
19ea0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
19eb0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
19ec0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
19ed0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
19ee0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
19ef0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
19f00 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
19f10 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
19f20 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
19f30 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
19f40 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
19f50 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
19f60 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
19f70 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
19f80 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
19f90 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
19fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
19fb0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65  **   }.**.** The
19fc0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
19fd0 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62 65  flag is never be
19fe0 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61   set for tempora
19ff0 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79  ry files, or any
1a000 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69  .** file operati
1a010 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1a020 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63  de (Pager.noSync
1a030 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f   set to non-zero
1a040 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  )..**.** If succ
1a050 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
1a060 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
1a070 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1a080 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
1a090 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
1a0a0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
1a0b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a0c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a0d0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
1a0e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1a0f0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1a100 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a110 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
1a130 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
1a140 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a150 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1a160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a170 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1a180 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1a190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1a1a0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1a1b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
1a1c0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a1f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20  rn code */.     
1a200 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
1a210 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1a220 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a230 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1a240 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1a250 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1a260 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
1a270 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1a280 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1a290 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1a2a0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
1a2b0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
1a2c0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
1a2d0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
1a2e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
1a2f0 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
1a300 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
1a310 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
1a320 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
1a330 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
1a340 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a350 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
1a360 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
1a370 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
1a380 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
1a390 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
1a3a0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
1a3b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
1a3c0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
1a3d0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
1a3e0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
1a3f0 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
1a400 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a410 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
1a420 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ions transaction
1a430 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
1a440 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
1a450 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
1a460 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
1a470 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
1a480 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
1a490 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
1a4a0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
1a4b0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
1a4c0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
1a4d0 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
1a4e0 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
1a4f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
1a500 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
1a510 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
1a520 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
1a530 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
1a540 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
1a550 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
1a560 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
1a570 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
1a580 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
1a590 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
1a5a0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
1a5b0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
1a5c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
1a5d0 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
1a5e0 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
1a5f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1a600 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
1a610 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
1a620 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
1a630 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a640 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
1a650 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
1a660 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
1a670 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
1a680 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
1a690 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
1a6a0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
1a6b0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
1a6c0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
1a6d0 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
1a6e0 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
1a6f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1a700 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
1a710 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
1a720 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
1a730 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
1a740 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
1a750 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
1a760 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
1a770 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
1a780 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
1a790 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
1a7a0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
1a7b0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
1a7c0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
1a7d0 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
1a7e0 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
1a7f0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
1a800 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
1a810 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
1a820 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
1a830 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b 73 69  ;..u8 zHeader[si
1a840 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1a850 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70 79  ic)+4];...memcpy
1a860 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
1a870 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
1a880 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
1a890 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a 48 65  ..put32bits(&zHe
1a8a0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1a8b0 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
1a8c0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
1a8d0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
1a8e0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1a8f0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1a900 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a910 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1a920 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1a930 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1a940 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1a950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a960 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1a970 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1a980 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1a990 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a9a0 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1a9b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a9c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a9d0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1a9e0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1a9f0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1aa00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1aa10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1aa20 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1aa30 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1aa40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1aa50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1aa60 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1aa70 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1aa80 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1aa90 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1aaa0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1aab0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1aac0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1aad0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1aae0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1aaf0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1ab00 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1ab10 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1ab20 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1ab30 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1ab40 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1ab50 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1ab60 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1ab70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1ab80 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ab90 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1aba0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1abb0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1abc0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1abd0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1abe0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1abf0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1ac00 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1ac10 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1ac20 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1ac30 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1ac40 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1ac50 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1ac60 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1ac70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ac80 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1ac90 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1aca0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1acb0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1acc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1acd0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1ace0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1acf0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1ad00 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1ad10 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1ad20 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1ad30 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1ad40 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1ad50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1ad60 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1ad70 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1ad80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1ad90 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1ada0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1adb0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1adc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1add0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ade0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1adf0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1ae00 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
1ae10 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
1ae20 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
1ae30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1ae40 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
1ae50 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
1ae60 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1ae70 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
1ae80 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29 3b 0a  >journalHdr..);.
1ae90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1aea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1aeb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1aec0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1aed0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1aee0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1aef0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1af00 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1af10 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1af20 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1af30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1af40 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1af50 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
1af60 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1af70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1af80 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
1af90 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
1afa0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
1afb0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1afc0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
1afd0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
1afe0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1aff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b010 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b020 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b030 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63 65  e was just succe
1b040 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
1b050 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79  Set Pager.needSy
1b060 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65  nc .    ** to ze
1b070 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  ro and clear the
1b080 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1b090 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67   flag on all pag
1b0a0 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
1b0b0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b0c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b0d0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1b0e0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b0f0 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1b100 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1b110 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1b120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1b140 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1b150 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1b160 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1b170 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1b180 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1b190 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1b1a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1b1b0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1b1c0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1b1d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1b1e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b1f0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1b200 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1b210 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1b220 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1b230 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1b250 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1b260 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1b270 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1b280 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1b290 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b2a0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1b2b0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1b2c0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1b2d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1b2e0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1b2f0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1b300 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1b310 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1b320 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1b330 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b340 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1b350 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1b360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b370 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1b380 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1b390 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1b3a0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1b3b0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1b3c0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1b3d0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1b3e0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1b3f0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1b400 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1b410 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1b420 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1b430 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1b440 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1b450 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1b460 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1b470 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1b480 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1b490 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1b4a0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1b4b0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1b4c0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1b4d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1b4e0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1b4f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b500 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1b510 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1b520 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1b530 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1b540 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1b550 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1b560 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1b570 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1b580 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1b590 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1b5a0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1b5b0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1b5c0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1b5d0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1b5e0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1b5f0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1b600 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1b610 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1b620 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1b630 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1b640 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1b650 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1b660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1b670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b680 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1b690 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1b6a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1b6b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1b6c0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1b6d0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1b6e0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1b6f0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b700 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1b710 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1b720 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1b730 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1b740 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b760 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1b770 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b7a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1b7b0 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1b7c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1b7d0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1b7e0 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1b7f0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1b800 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1b810 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1b820 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1b830 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1b840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b850 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1b860 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1b870 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1b880 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1b890 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1b8a0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1b8b0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1b8c0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1b8d0 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1b8e0 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1b8f0 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1b900 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1b910 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1b920 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1b930 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1b940 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1b950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1b960 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1b970 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1b980 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1b990 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1b9a0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1b9b0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1b9c0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1b9d0 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1b9e0 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1b9f0 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1ba00 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1ba10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1ba20 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1ba30 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1ba40 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1ba50 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1ba60 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1ba70 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1ba80 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1ba90 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1baa0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1bab0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1bac0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1bad0 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1bae0 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1baf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bb00 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1bb10 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1bb20 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1bb30 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1bb40 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1bb50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bb60 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1bb70 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20  ESERVED );.  rc 
1bb80 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1bb90 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1bba0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20  LUSIVE_LOCK);.. 
1bbb0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1bbc0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
1bbd0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1bbe0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
1bbf0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
1bc00 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1bc10 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
1bc20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
1bc30 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
1bc40 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
1bc50 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1bc60 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1bc70 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
1bc80 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
1bc90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1bca0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1bcb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
1bcc0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1bcd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1bce0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
1bcf0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
1bd00 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
1bd10 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1bd20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bd30 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
1bd40 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
1bd50 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
1bd60 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
1bd70 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
1bd80 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
1bd90 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1bda0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
1bdb0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
1bdc0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
1bdd0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1bde0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
1bdf0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
1be00 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
1be10 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
1be20 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
1be30 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
1be40 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
1be50 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
1be60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1be70 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
1be80 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
1be90 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
1bea0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1beb0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
1bec0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
1bed0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 20 20  rDontWrite()).  
1bee0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 63 6f 6d  Note that if com
1bef0 70 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a  piled with.    *
1bf00 2a 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  * SQLITE_SECURE_
1bf10 44 45 4c 45 54 45 20 74 68 65 20 50 47 48 44 52  DELETE the PGHDR
1bf20 5f 44 4f 4e 54 5f 57 52 49 54 45 20 62 69 74 20  _DONT_WRITE bit 
1bf30 69 73 20 6e 65 76 65 72 20 73 65 74 20 61 6e 64  is never set and
1bf40 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   so.    ** the s
1bf50 65 63 6f 6e 64 20 74 65 73 74 20 69 73 20 61 6c  econd test is al
1bf60 77 61 79 73 20 74 72 75 65 2e 0a 20 20 20 20 2a  ways true..    *
1bf70 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1bf80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1bf90 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1bfa0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1bfb0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1bfc0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1bfd0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1bfe0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1bff0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c000 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c010 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1c040 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1c050 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1c060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1c070 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1c080 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c090 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1c0a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c0b0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1c0c0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1c0d0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1c0e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c0f0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c100 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1c110 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c120 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1c130 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1c140 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1c150 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1c160 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1c170 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1c180 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1c190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c1a0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1c1b0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1c1c0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1c1d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1c1e0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1c1f0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1c200 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1c210 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1c220 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c230 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1c240 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1c250 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c270 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1c280 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1c290 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c2a0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1c2b0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1c2c0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1c2d0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1c2e0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1c2f0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1c300 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1c310 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1c320 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1c330 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1c340 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1c350 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1c360 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1c370 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c3a0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1c3b0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1c3c0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1c3d0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1c3e0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1c3f0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c400 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c410 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1c420 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c430 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1c440 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c450 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c460 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1c470 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c480 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1c490 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1c4a0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1c4b0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1c4c0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1c4d0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1c4e0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1c4f0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1c500 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c520 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1c530 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1c540 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1c550 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1c560 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1c570 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1c580 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1c590 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1c5a0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1c5b0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1c5c0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1c5d0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1c5e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1c5f0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1c600 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1c610 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1c620 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1c630 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1c640 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1c650 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1c660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c670 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c680 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1c690 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1c6a0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1c6b0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1c6c0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1c6d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1c6e0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1c6f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1c700 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1c710 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1c720 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1c730 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1c740 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1c750 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1c760 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1c770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c780 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c790 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1c7a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1c7b0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1c7c0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1c7d0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1c7e0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1c7f0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1c800 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c810 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1c820 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1c830 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1c840 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1c850 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1c860 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1c870 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1c880 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1c890 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c8a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1c8b0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1c8c0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1c8d0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1c8e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1c8f0 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1c900 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1c910 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1c920 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c940 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1c950 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1c960 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1c970 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1c980 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1c990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1c9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c9b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1c9c0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1c9d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1c9e0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1c9f0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1ca00 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1ca10 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1ca20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ca30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1ca40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ca50 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
1ca60 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
1ca70 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
1ca80 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
1ca90 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
1caa0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1cab0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
1cac0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
1cad0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
1cae0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
1caf0 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
1cb00 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
1cb10 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
1cb20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1cb30 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
1cb40 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
1cb50 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
1cb60 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
1cb70 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1cb80 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
1cb90 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
1cba0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1cbb0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
1cbc0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1cbd0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
1cbe0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
1cbf0 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
1cc00 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
1cc10 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
1cc20 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
1cc30 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
1cc40 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
1cc50 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
1cc60 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
1cc70 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
1cc80 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
1cc90 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
1cca0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
1ccb0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
1ccc0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
1ccd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
1cce0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
1ccf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1cd00 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
1cd10 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
1cd20 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
1cd30 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1cd40 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
1cd50 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
1cd60 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
1cd70 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
1cd80 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1cd90 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
1cda0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
1cdb0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
1cdc0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
1cdd0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
1cde0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1cdf0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
1ce00 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
1ce10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1ce20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
1ce30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ce40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1ce50 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
1ce60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ce70 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
1ce80 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
1ce90 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1cea0 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73   is set by the s
1ceb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cec0 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  () function whil
1ced0 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75  e it.  ** is jou
1cee0 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f  rnalling a set o
1cef0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61  f two or more da
1cf00 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61  tabase pages tha
1cf10 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a  t are stored.  *
1cf20 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69  * on the same di
1cf30 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69  sk sector. Synci
1cf40 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ng the journal i
1cf50 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68  s not allowed wh
1cf60 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73  ile.  ** this is
1cf70 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74   happening as it
1cf80 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1cf90 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  at all members o
1cfa0 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65  f such a.  ** se
1cfb0 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
1cfc0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
1cfd0 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
1cfe0 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
1cff0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72  ction.  ** is tr
1d000 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65  ying to make cle
1d010 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  an will require 
1d020 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61  a journal sync a
1d030 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  nd the doNotSync
1d040 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65  .  ** flag is se
1d050 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  t, return withou
1d060 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
1d070 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79  . The pcache lay
1d080 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73  er will.  ** jus
1d090 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65  t have to go ahe
1d0a0 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ad and allocate 
1d0b0 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65  a new page buffe
1d0c0 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a  r instead of.  *
1d0d0 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20  * reusing pPg.. 
1d0e0 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72   **.  ** Similar
1d0f0 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72  ly, if the pager
1d100 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
1d110 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
1d120 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a  tate, do not.  *
1d130 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74  * try to write t
1d140 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
1d150 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f  Pg to disk..  */
1d160 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
1d170 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20  ger->errCode).  
1d180 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e   || (pPager->doN
1d190 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66  otSync && pPg->f
1d1a0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d1b0 53 59 4e 43 29 0a 20 20 29 7b 0a 20 20 20 20 72  SYNC).  ){.    r
1d1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  .  }..  /* Sync 
1d1e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d1f0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
1d200 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
1d210 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1d220 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79  C ){.    rc = sy
1d230 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1d240 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1d260 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1d270 0a 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d  .      !(pPager-
1d280 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
1d290 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1d2a0 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20  MEMORY) &&.     
1d2b0 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
1d2c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1d2d0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
1d2e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1d2f0 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20  APPEND).    ){. 
1d300 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1d310 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  c = 0;.      rc 
1d320 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1d330 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1d340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1d350 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1d360 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
1d370 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
1d380 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
1d390 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1d3a0 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
1d3b0 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
1d3c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1d3d0 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  nal..  ** This i
1d3e0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
1d3f0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
1d400 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
1d410 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  ow will not.  **
1d420 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
1d430 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
1d440 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1d450 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65   **.  ** Conside
1d460 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1d470 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
1d480 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ts:.  **.  **   
1d490 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
1d4a0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
1d4b0 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66  .  **     <modif
1d4c0 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20  y page X>.  **  
1d4d0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
1d4e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72  .  **       <shr
1d4f0 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
1d500 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
1d510 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
1d520 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a  ress(page X).  *
1d530 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
1d540 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  O sp;.  **.  ** 
1d550 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
1d560 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
1d570 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
1d580 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
1d590 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  tten.  ** out to
1d5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d5b0 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
1d5c0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
1d5d0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
1d5e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
1d5f0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
1d600 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
1d610 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
1d620 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20   read.  ** data 
1d630 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d640 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
1d650 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
1d660 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
1d670 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
1d680 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
1d690 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
1d6a0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
1d6b0 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20  NT sp".  ** was 
1d6c0 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20  executed..  **. 
1d6d0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
1d6e0 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
1d6f0 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
1d700 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
1d710 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
1d720 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
1d730 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1d740 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
1d750 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  at it will.  ** 
1d760 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
1d770 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
1d780 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
1d790 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
1d7a0 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
1d7b0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 0a  */.  if( NEVER(.
1d7c0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1d7d0 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
1d7e0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
1d7f0 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
1d800 61 67 65 28 70 50 67 29 0a 20 20 29 20 29 7b 0a  age(pPg).  ) ){.
1d810 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
1d820 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
1d830 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
1d840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1d850 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
1d860 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d870 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1d880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1d890 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1d8a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1d8b0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1d8c0 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  g);.  }..  /* Ma
1d8d0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1d8e0 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
1d8f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d900 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1d910 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
1d920 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1d930 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1d940 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
1d950 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1d960 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
1d970 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1d980 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1d990 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1d9a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
1d9b0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
1d9c0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
1d9d0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
1d9e0 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
1d9f0 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
1da00 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
1da10 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
1da20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1da30 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
1da40 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1da50 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
1da60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1da70 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
1da80 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
1da90 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
1daa0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
1dab0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
1dac0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
1dad0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
1dae0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
1daf0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
1db00 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
1db10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
1db20 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
1db30 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
1db40 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
1db50 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
1db60 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
1db70 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
1db80 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
1db90 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
1dba0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
1dbb0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
1dbc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
1dbd0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
1dbe0 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
1dbf0 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
1dc00 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1dc10 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
1dc20 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
1dc30 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
1dc40 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
1dc50 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
1dc60 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
1dc70 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
1dc80 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
1dc90 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
1dca0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
1dcb0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
1dcc0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
1dcd0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
1dce0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
1dcf0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
1dd00 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
1dd10 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
1dd20 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  e PAGER_OMIT_JOU
1dd30 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e  RNAL and PAGER_N
1dd40 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73  O_READLOCK flags
1dd50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
1dd60 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
1dd70 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
1dd80 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
1dd90 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
1dda0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
1ddb0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
1ddc0 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
1ddd0 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
1dde0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1ddf0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
1de00 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
1de10 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
1de20 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
1de30 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
1de40 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1de50 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
1de60 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
1de70 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
1de80 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1de90 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
1dea0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
1deb0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
1dec0 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
1ded0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
1dee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1def0 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
1df00 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
1df10 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
1df20 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
1df30 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
1df40 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
1df50 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
1df60 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
1df70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1df80 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
1df90 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
1dfa0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
1dfb0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
1dfc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1dfd0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
1dfe0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
1dff0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1e000 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
1e010 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1e020 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
1e030 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
1e040 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
1e050 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
1e060 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
1e070 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
1e080 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
1e090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e0a0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
1e0b0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1e0c0 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
1e0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
1e0e0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
1e0f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
1e100 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
1e110 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
1e120 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
1e130 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
1e140 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
1e150 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
1e160 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
1e170 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e180 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
1e190 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
1e1a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e1b0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
1e1c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e1d0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
1e1e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1e1f0 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
1e200 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
1e210 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
1e220 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
1e230 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1e240 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1e250 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
1e260 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
1e270 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e280 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
1e290 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
1e2a0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
1e2b0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
1e2c0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
1e2d0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
1e2e0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
1e2f0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
1e300 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
1e310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e320 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
1e330 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1e340 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1e350 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
1e360 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
1e370 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
1e380 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
1e390 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
1e3a0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
1e3b0 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
1e3c0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
1e3d0 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
1e3e0 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d  ;  /* True to om
1e3f0 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  it read-lock */.
1e400 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
1e410 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e420 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
1e430 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
1e440 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
1e450 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c  .  u16 szPageDfl
1e460 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
1e470 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
1e480 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
1e490 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ize */..  /* Fig
1e4a0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
1e4b0 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
1e4c0 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
1e4d0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
1e4e0 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
1e4f0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
1e500 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
1e510 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
1e520 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
1e530 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
1e540 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
1e550 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
1e560 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1e570 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
1e580 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
1e590 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
1e5a0 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
1e5b0 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
1e5c0 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
1e5d0 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
1e5e0 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
1e5f0 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
1e600 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
1e610 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
1e620 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
1e630 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
1e640 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
1e650 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
1e660 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
1e670 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
1e680 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
1e690 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1e6a0 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
1e6b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
1e6c0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
1e6d0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
1e6e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
1e6f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1e700 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
1e710 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
1e720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1e730 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
1e740 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
1e750 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
1e760 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
1e770 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
1e780 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
1e790 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1e7a0 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
1e7b0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
1e7c0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
1e7d0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
1e7e0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
1e7f0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
1e800 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
1e810 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
1e820 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
1e830 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
1e840 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1e850 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
1e860 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   ){.    nPathnam
1e870 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
1e880 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
1e890 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
1e8a0 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a  alloc(nPathname*
1e8b0 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
1e8c0 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
1e8d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66  NOMEM;.    }.#if
1e8f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e900 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
1e910 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
1e920 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
1e930 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
1e940 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
1e950 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
1e960 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1e970 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68     {.      zPath
1e980 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
1e990 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
1e9a0 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
1e9b0 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
1e9c0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ls */.      rc =
1e9d0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
1e9e0 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
1e9f0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
1ea00 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
1ea10 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e     }..    nPathn
1ea20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1ea30 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
1ea40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ea50 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
1ea60 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
1ea70 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
1ea80 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
1ea90 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
1eaa0 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
1eab0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
1eac0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1ead0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
1eae0 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
1eaf0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1eb00 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
1eb10 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
1eb20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1eb30 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
1eb40 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
1eb50 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
1eb60 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
1eb70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1eb80 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
1eb90 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
1eba0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
1ebb0 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
1ebc0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
1ebd0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
1ebe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1ebf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ec00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ec10 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1ec20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ec30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
1ec40 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
1ec50 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
1ec60 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
1ec70 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
1ec80 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
1ec90 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
1eca0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
1ecb0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
1ecc0 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
1ecd0 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
1ece0 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
1ecf0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1ed00 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
1ed30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ed40 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
1ed70 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
1ed80 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
1ed90 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
1eda0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
1edb0 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
1edc0 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
1edd0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
1ede0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
1edf0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
1ee00 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
1ee10 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1ee20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1ee30 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1ee40 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1ee50 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1ee60 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1ee70 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
1ee80 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
1ee90 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1eea0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
1eeb0 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
1eec0 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
1eed0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1eee0 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
1eef0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
1ef00 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
1ef10 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
1ef20 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
1ef30 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
1ef40 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
1ef50 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
1ef60 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
1ef70 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1ef80 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
1ef90 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1efa0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
1efb0 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
1efc0 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
1efd0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eff0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
1f000 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
1f010 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
1f020 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
1f030 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
1f040 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1f050 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
1f060 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
1f070 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
1f080 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
1f090 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f0a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
1f0b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f0c0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
1f0e0 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
1f0f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
1f100 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
1f110 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
1f120 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
1f130 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
1f140 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f150 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f160 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
1f170 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
1f180 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
1f190 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
1f1a0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
1f1b0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
1f1c0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f1d0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
1f1e0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
1f1f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
1f200 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
1f210 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
1f220 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
1f230 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1f240 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
1f250 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
1f260 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
1f270 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
1f280 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
1f290 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
1f2a0 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
1f2b0 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  me ){.    pPager
1f2c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
1f2d0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
1f2e0 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20  Pathname + 1);. 
1f2f0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
1f300 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
1f310 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
1f320 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
1f330 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1f340 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f350 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f360 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
1f370 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
1f380 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b   "-journal", 8);
1f390 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1f3a0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  >zFilename[0]==0
1f3b0 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72   ) pPager->zJour
1f3c0 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  nal[0] = 0;.    
1f3d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
1f3e0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
1f3f0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
1f400 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
1f410 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
1f420 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
1f430 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
1f440 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1f450 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1f460 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
1f470 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
1f480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f490 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
1f4a0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
1f4b0 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
1f4c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1f4d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
1f4e0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
1f4f0 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
1f500 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
1f510 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
1f520 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1f530 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1f540 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
1f550 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
1f560 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
1f570 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
1f580 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
1f590 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
1f5a0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
1f5b0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1f5c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1f5d0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
1f5e0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
1f5f0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
1f600 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
1f610 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f620 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
1f630 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1f640 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
1f650 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1f660 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
1f670 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
1f680 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1f690 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
1f6a0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1f6b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
1f6c0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
1f6d0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1f6e0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
1f6f0 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
1f700 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
1f710 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f720 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
1f730 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
1f740 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
1f750 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1f760 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
1f770 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
1f780 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f790 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
1f7a0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1f7b0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f7c0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
1f7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f7e0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f7f0 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
1f800 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
1f810 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
1f820 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1f830 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1f840 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
1f850 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
1f860 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1f870 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1f880 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
1f890 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
1f8a0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
1f8b0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
1f8c0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
1f8d0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1f8e0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
1f8f0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
1f900 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f910 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f920 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
1f930 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
1f940 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
1f950 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
1f960 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
1f970 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
1f980 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
1f990 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
1f9a0 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
1f9b0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
1f9c0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
1f9d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1f9e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1f9f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1fa00 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
1fa10 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
1fa20 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
1fa30 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
1fa40 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
1fa50 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
1fa60 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
1fa70 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
1fa80 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
1fa90 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
1faa0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
1fab0 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
1fac0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
1fad0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
1fae0 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
1faf0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1fb00 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
1fb10 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1fb20 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1fb30 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
1fb40 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
1fb50 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
1fb60 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
1fb70 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
1fb80 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
1fb90 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
1fba0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
1fbb0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1fbc0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1fbd0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
1fbe0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
1fbf0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
1fc00 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1fc10 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
1fc20 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
1fc30 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
1fc40 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
1fc50 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
1fc60 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
1fc70 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
1fc80 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
1fc90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1fcb0 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
1fcc0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1fcd0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1fce0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
1fcf0 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
1fd00 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fd10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1fd20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
1fd30 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
1fd40 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
1fd50 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
1fd60 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
1fd70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
1fd80 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
1fd90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
1fda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fdb0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1fdc0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
1fdd0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1fde0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
1fdf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1fe00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
1fe10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1fe20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1fe30 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
1fe40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
1fe50 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
1fe60 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
1fe70 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
1fe80 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
1fe90 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
1fea0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
1fec0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
1fed0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1fee0 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
1fef0 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
1ff00 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
1ff10 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
1ff20 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
1ff30 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
1ff40 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
1ff50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
1ff60 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
1ff70 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
1ff80 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
1ff90 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
1ffa0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
1ffb0 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c  dlock = (noReadl
1ffc0 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29  ock && readOnly)
1ffd0 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67   ?1:0;.  /* pPag
1ffe0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
1fff0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20000 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
20010 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20020 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
20030 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
20040 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  lid = (u8)memDb;
20050 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20060 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
20070 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
20080 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
20090 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
200a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
200b0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
200c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
200d0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
200e0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
200f0 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
20100 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
20110 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
20120 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
20130 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
20140 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
20150 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
20160 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
20170 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
20180 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
20190 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
201a0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
201b0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
201c0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
201d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
201e0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
201f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
20200 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
20210 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
20220 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
20230 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
20240 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
20250 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
20260 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
20270 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
20280 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
20290 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
202a0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
202b0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
202c0 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  = 0; */.  assert
202d0 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
202e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
202f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
20300 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
20310 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
20320 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
20330 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
20340 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
20350 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
20360 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
20370 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
20380 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
20390 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
203a0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
203b0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
203c0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
203d0 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
203e0 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
203f0 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
20400 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
20410 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
20420 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
20430 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
20440 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
20450 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
20460 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
20470 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
20480 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20490 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
204a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
204b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
204c0 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
204d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
204e0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
204f0 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
20500 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
20510 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
20520 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
20530 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
20540 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20550 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
20560 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
20570 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
20580 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
20590 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
205a0 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
205b0 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
205c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
205d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
205e0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
205f0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
20600 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
20610 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
20620 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
20630 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
20640 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
20650 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
20660 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
20670 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
20680 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
20690 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
206a0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
206b0 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
206c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
206d0 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
206e0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
206f0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20700 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
20710 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
20720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
20730 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
20740 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
20750 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
20760 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
20770 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
20780 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20790 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
207a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
207b0 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
207c0 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
207d0 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
207e0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
207f0 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
20800 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20810 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
20820 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
20830 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
20840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20850 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
20860 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
20870 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
20880 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
20890 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
208a0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
208b0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
208c0 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
208d0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
208e0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
208f0 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
20900 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
20910 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
20920 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
20930 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
20940 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20950 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
20960 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
20970 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20980 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
20990 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
209a0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
209b0 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
209c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
209d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
209e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
209f0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
20a00 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
20a10 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
20a20 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
20a30 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
20a40 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
20a50 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
20a60 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
20a70 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20a80 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
20a90 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
20aa0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
20ab0 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
20ac0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20ad0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
20ae0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
20af0 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
20b00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
20b10 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
20b20 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20b30 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
20b40 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
20b50 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
20b60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
20b70 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
20b80 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
20b90 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
20ba0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
20bb0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
20bc0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
20bd0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
20be0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20bf0 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
20c00 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
20c10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
20c20 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
20c30 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20c40 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
20c50 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
20c60 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
20c70 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20ca0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
20cb0 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
20cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20cd0 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
20ce0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
20cf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20d00 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
20d10 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
20d20 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
20d30 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20d40 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20d50 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
20d60 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65  ->jfd) );.  asse
20d70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
20d80 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
20d90 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73  D );..  *pExists
20da0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
20db0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
20dc0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
20dd0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
20de0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
20df0 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
20e00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
20e10 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
20e20 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  cked;           
20e30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20e40 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
20e50 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
20e60 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
20e70 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
20e80 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
20e90 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
20ea0 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
20eb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
20ec0 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
20ed0 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
20ee0 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
20ef0 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
20f00 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
20f10 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
20f20 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
20f30 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
20f40 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
20f50 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
20f60 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
20f70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
20f80 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
20f90 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
20fa0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
20fb0 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
20fc0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
20fd0 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
20fe0 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
20ff0 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
21000 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
21010 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
21020 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
21030 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
21040 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
21050 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
21060 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
21070 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
21080 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
21090 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
210a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
210b0 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
210c0 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
210d0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Page;..      /* 
210e0 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
210f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21100 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
21110 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
21120 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
21130 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
21140 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
21150 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
21160 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
21170 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
21180 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
21190 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
211a0 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
211b0 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
211c0 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
211d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
211e0 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
211f0 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
21200 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
21210 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
21220 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
21230 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
21240 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
21250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21260 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
21270 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21280 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
21290 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
212a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
212b0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
212c0 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
212d0 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
212e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
212f0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
21300 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21310 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
21320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21330 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
21340 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
21350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
21370 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
21380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
213a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
213b0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
213c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
213d0 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
213e0 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
213f0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
21400 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
21410 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
21420 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
21430 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
21440 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
21450 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21470 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
21480 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
21490 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
214a0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
214b0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
214c0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
214d0 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
214e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
214f0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
21500 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21510 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
21520 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
21530 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21540 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
21550 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21560 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
21570 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
21580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21590 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
215a0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
215b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
215c0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
215d0 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
215e0 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
215f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21610 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
21630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21640 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21650 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21660 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
21670 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
21680 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
21690 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
216a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
216b0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
216c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
216d0 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
216e0 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
216f0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
21700 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
21710 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
21720 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
21730 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
21740 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
21750 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
21760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21770 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
21780 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
21790 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
217a0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
217b0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
217c0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
217d0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
217e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
217f0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
21800 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
21810 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
21820 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
21830 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
21840 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
21850 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
21860 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
21870 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
21880 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
21890 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
218a0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
218b0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
218c0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
218d0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
218e0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
218f0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
21900 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21910 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21920 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
21930 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21940 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
21950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21960 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21980 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
21990 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
219a0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
219b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
219c0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
219d0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
219e0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
219f0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
21a00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
21a10 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
21a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21a30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
21a40 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
21a50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
21a60 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
21a70 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
21a80 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
21a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21aa0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
21ab0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
21ac0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
21ad0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
21ae0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
21af0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
21b00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21b10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21b20 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
21b30 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
21b40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21b50 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
21b60 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
21b70 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
21b80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
21b90 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
21ba0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
21bb0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
21bc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21be0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21bf0 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c10 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
21c20 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
21c30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21c40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21c50 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
21c60 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
21c70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21c80 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  >fd) );..  if( N
21c90 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61  EVER(!isOpen(pPa
21ca0 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
21cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21cc0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
21cd0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
21ce0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
21cf0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65  ageSize);.    re
21d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21d10 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20 3d 20    }.  iOffset = 
21d20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
21d30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
21d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21d50 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
21d60 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
21d70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
21d80 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
21d90 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
21da0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
21db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21dc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
21dd0 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38 20 2a 64  ==1 ){.    u8 *d
21de0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
21df0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
21e00 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  4];.    memcpy(&
21e10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
21e20 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
21e30 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
21e40 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
21e50 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
21e60 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
21e70 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
21e80 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
21e90 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
21ea0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
21eb0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
21ec0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
21ed0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
21ee0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
21ef0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
21f00 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
21f10 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
21f20 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
21f30 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
21f40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
21f50 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
21f60 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
21f70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21f80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21f90 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
21fa0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
21fb0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21fc0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
21fd0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
21fe0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
21ff0 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
22000 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
22010 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
22020 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
22030 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
22040 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
22050 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
22060 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22070 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
22080 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
22090 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
220a0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
220b0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
220c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
220d0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
220e0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
220f0 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
22100 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
22110 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
22120 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
22130 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
22140 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
22150 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
22160 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22170 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
22180 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
22190 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
221a0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
221b0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
221c0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
221d0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
221e0 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
221f0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
22200 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
22210 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
22220 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
22230 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
22240 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
22250 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
22260 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
22270 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
22280 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
22290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
222a0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
222b0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
222c0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
222d0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
222e0 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
222f0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
22300 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
22310 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
22320 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
22330 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
22340 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
22350 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
22360 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
22370 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
22380 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
22390 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
223a0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
223b0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
223c0 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
223d0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
223e0 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
223f0 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
22400 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
22410 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
22420 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
22430 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
22440 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
22450 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
22460 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
22470 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
22480 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
22490 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
224a0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
224b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
224c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
224d0 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
224e0 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
224f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
22500 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
22510 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
22520 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22530 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
22540 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
22550 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22560 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
22570 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
22580 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
22590 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
225a0 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
225b0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
225c0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
225d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
225e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
225f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
22600 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
22610 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
22620 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
22630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22650 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22660 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
22670 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
22680 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22690 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
226a0 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
226b0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
226c0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
226d0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
226e0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
226f0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
22700 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a  standing pages *
22710 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
22720 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
22730 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22740 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  e)==0 );.  if( N
22750 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
22760 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
22770 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
22780 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f  >errCode; }..  /
22790 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
227a0 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  se is in an erro
227b0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
227c0 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  a chance to clea
227d0 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
227e0 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
227f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22800 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f  ger-cache and ro
22810 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20  llback.  ** any 
22820 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74  hot journal in t
22830 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
22840 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
22850 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
22860 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
22870 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
22880 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b  ger->zJournal ){
22890 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65  .      isErrorRe
228a0 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  set = 1;.    }. 
228b0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
228c0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
228d0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
228e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
228f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
22900 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
22910 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
22920 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
22930 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
22940 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
22950 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
22960 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
22970 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
22980 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22990 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
229a0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
229b0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
229c0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
229d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ock ){.      ass
229e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
229f0 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70  dOnly );.      p
22a00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
22a10 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
22a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
22a30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
22a40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
22a50 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
22a60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
22a80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22a90 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
22aa0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
22ab0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
22ac0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
22ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22ae0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22af0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
22b00 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
22b10 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22b20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
22b30 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
22b40 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
22b50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
22b60 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
22b70 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
22b80 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
22b90 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
22ba0 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
22bb0 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  et ){.      asse
22bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
22bd0 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
22be0 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  D );.      rc = 
22bf0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
22c00 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
22c10 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
22c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22c30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
22c40 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
22c50 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
22c60 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
22c70 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
22c80 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
22c90 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22ca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22cb0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
22cc0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
22cd0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
22ce0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
22cf0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
22d00 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
22d10 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
22d20 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
22d30 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
22d40 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
22d50 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
22d60 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
22d70 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
22d80 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
22d90 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
22da0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
22db0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
22dc0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
22dd0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
22de0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
22df0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
22e00 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
22e10 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
22e20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
22e30 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
22e40 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
22e50 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
22e60 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
22e70 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
22e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
22e90 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
22ea0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
22eb0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
22ec0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
22ed0 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
22ee0 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
22ef0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22f00 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
22f10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
22f20 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
22f30 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
22f40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
22f50 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
22f60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
22f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
22f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
22fa0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22fb0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
22fc0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
22fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
22fe0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
22ff0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
23000 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
23010 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
23020 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
23030 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
23040 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
23050 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
23060 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
23070 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
23080 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
23090 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
230a0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
230b0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
230c0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
230d0 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
230e0 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
230f0 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
23100 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
23110 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
23120 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
23130 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
23140 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
23150 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
23160 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23170 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
23180 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
23190 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
231a0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
231b0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
231c0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
231d0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
231e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
231f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
23200 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
23210 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
23220 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23230 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
23240 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
23250 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23260 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
23270 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
23280 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
23290 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
232a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
232b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
232c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
232d0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
232e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
232f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23300 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
23310 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
23320 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23330 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
23340 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
23350 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
23360 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23370 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
23380 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23390 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
233a0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
233b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
233c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
233d0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
233e0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
233f0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
23400 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
23410 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
23420 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
23430 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
23440 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
23450 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
23460 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
23470 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
23480 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
23490 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
234a0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
234b0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
234c0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
234d0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
234e0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
234f0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
23500 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
23510 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
23520 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
23530 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
23540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
23550 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
23560 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
23570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
235a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
235b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
235c0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ..      /* TODO:
235d0 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20 63   Why are these c
235e0 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73 20  leared here? Is 
235f0 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f  it necessary? */
23600 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23610 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
23620 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
23630 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
23640 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
23650 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
23660 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23670 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
23680 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
23690 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
236a0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
236b0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
236c0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
236d0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
236e0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
236f0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
23700 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
23710 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
23720 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
23730 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
23740 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
23750 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
23760 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ache..      */. 
23770 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
23780 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
23790 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
237a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
237b0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
237c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
237d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
237e0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
237f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
23800 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23810 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
23820 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23830 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
23840 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
23850 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
23860 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
23870 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
23880 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
23890 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
238a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50     }..    if( pP
238b0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
238c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
238d0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
238e0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
238f0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
23900 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
23910 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
23920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23930 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
23940 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
23950 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
23960 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
23970 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
23980 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
23990 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
239a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
239b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
239c0 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
239d0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
239e0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
239f0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
23a00 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
23a10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
23a20 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
23a30 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
23a40 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
23a50 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
23a60 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
23a70 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
23a80 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
23a90 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
23aa0 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
23ab0 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
23ac0 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
23ad0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
23ae0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
23af0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
23b00 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
23b10 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
23b20 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
23b30 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
23b40 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
23b50 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
23b60 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
23b70 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
23b80 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
23b90 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
23ba0 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
23bb0 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
23bc0 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
23bd0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
23be0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
23bf0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
23c00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
23c10 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
23c20 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
23c30 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
23c40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
23c50 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
23c60 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
23c70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
23c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
23c90 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
23ca0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
23cb0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
23cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23cd0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
23ce0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23cf0 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
23d00 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
23d10 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
23d20 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
23d30 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
23d40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23d50 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
23d60 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
23d70 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
23d80 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
23d90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23db0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23de0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
23df0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
23e00 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
23e10 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
23e20 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
23e30 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
23e40 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
23e50 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
23e60 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
23e70 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
23e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
23e90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
23ea0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
23eb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23ec0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
23ed0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
23ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23ef0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
23f00 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
23f10 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
23f20 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
23f30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
23f40 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
23f50 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
23f60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23f70 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
23f80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
23f90 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
23fa0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
23fb0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
23fc0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
23fd0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
23fe0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
23ff0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
24000 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
24010 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
24020 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
24030 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
24040 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
24050 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
24060 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
24070 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
24080 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
24090 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
240a0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
240b0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
240c0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
240d0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
240e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
240f0 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28  che)==0).   && (
24100 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
24110 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
24120 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
24130 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  .  ){.    pagerU
24140 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
24150 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
24160 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
24170 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
24180 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
24190 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
241a0 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
241b0 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
241c0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
241d0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
241e0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
241f0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
24200 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
24210 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
24220 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
24230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
24240 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
24250 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
24260 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
24270 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
24280 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
24290 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
242a0 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
242b0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
242c0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
242d0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
242e0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
242f0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
24300 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
24310 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
24320 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
24330 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
24340 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
24350 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
24360 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
24370 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
24380 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
24390 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
243a0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
243b0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
243c0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
243d0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
243e0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
243f0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
24400 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
24410 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
24420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24430 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
24440 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
24450 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
24460 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
24470 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
24480 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
24490 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
244a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
244b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
244c0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
244d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
244e0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
244f0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
24500 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
24510 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
24520 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
24530 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
24540 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
24550 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
24560 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
24570 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
24580 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
24590 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
245a0 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
245b0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
245c0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
245d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
245e0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
245f0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
24600 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
24610 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
24620 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
24630 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
24640 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
24650 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
24660 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
24670 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
24680 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
24690 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
246a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
246b0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
246c0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
246d0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
246e0 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 77  he to populate w
246f0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
24700 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
24710 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
24720 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
24730 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
24740 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
24750 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
24760 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
24770 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
24780 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
24790 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
247a0 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
247b0 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
247c0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
247d0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
247e0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
247f0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
24800 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
24810 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
24820 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
24830 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
24840 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
24850 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
24860 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
24870 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
24880 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
24890 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
248a0 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
248b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
248c0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
248d0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
248e0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
248f0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
24900 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
24910 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
24920 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
24930 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
24940 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
24950 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
24960 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
24970 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24980 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
24990 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
249a0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
249b0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
249c0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
249d0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
249e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
249f0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
24a00 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
24a10 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
24a20 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
24a30 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
24a40 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
24a50 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
24a60 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
24a70 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
24a80 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
24a90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
24aa0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
24ab0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
24ac0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
24ad0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
24ae0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
24af0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
24b00 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
24b10 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
24b20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
24b30 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
24b40 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
24b50 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
24b60 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
24b70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24b80 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
24b90 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
24ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24bb0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
24bc0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
24bd0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
24be0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
24bf0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
24c00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24c10 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
24c20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
24c30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
24c40 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
24c50 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
24c60 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
24c70 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
24c80 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
24c90 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
24ca0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
24cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24cc0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c  >state>PAGER_UNL
24cd0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  OCK );..  if( pg
24ce0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
24cf0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24d00 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
24d10 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
24d20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24d30 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
24d40 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
24d50 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
24d60 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
24d70 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
24d80 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
24d90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
24da0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
24db0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
24dc0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
24dd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
24de0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
24df0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
24e00 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
24e10 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
24e20 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
24e30 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
24e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24e50 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
24e60 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
24e70 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
24e80 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
24e90 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
24ea0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
24eb0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
24ec0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24ed0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
24ee0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
24ef0 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
24f00 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
24f10 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
24f20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
24f30 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
24f40 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
24f50 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
24f60 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
24f70 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
24f80 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
24f90 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
24fa0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
24fb0 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
24fc0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 2f  >pPager ){.    /
24fd0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
24fe0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
24ff0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
25000 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
25010 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
25020 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
25030 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
25040 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
25050 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
25060 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
25070 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
25080 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  r) );.    PAGER_
25090 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
250a0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
250b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
250c0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
250d0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
250e0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
250f0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
25100 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
25110 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
25120 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
25130 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  ;..    PAGER_INC
25140 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
25150 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ;.    pPg = *ppP
25160 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
25170 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
25180 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
25190 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
251a0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
251b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
251c0 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
251d0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
251e0 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
251f0 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
25200 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
25210 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
25220 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
25230 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
25240 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
25250 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25260 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25270 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
25280 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
252a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
252b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
252c0 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20  &nMax);.    if( 
252d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
252e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
252f0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
25300 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
25310 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74  MDB || nMax<(int
25320 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  )pgno || noConte
25330 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
25340 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
25350 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53 51 4c  gno ){..rc = SQL
25360 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74 6f 20  ITE_FULL;..goto 
25370 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25380 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
25390 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
253a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
253b0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
253c0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
253d0 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
253e0 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
253f0 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
25400 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
25410 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
25420 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
25430 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
25440 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
25450 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25460 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
25470 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
25480 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
25490 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
254a0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
254b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
254c0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
254d0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
254e0 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
254f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25500 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
25510 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
25520 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
25530 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
25540 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
25550 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
25560 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
25570 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
25580 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
25590 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
255a0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
255b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
255c0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
255d0 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
255e0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
255f0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
25600 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
25620 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
25630 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
25640 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 65  lloc();.      }e
25650 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
25660 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
25670 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
25680 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
25690 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
256a0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
256b0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
256c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
256d0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
256e0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
256f0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
25700 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
25710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25720 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
25730 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25740 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
25750 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25760 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
25770 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
25780 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
25790 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
257a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
257b0 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
257c0 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
257d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
257e0 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
257f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
25800 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
25810 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
25820 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
25830 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
25840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25850 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
25860 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
25870 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
25880 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
25890 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
258a0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
258b0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
258c0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
258d0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
258e0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
258f0 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75  ache. Also, retu
25900 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20  rn 0 if the .** 
25910 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
25920 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
25930 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25940 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
25950 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
25960 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
25970 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
25980 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a  SQLITE_FULL..**.
25990 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
259a0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
259b0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
259c0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
259d0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
259e0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
259f0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
25a00 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
25a10 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
25a20 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
25a30 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
25a40 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
25a50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
25a60 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
25a70 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
25a80 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
25a90 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
25aa0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
25ab0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
25ac0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
25ad0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
25ae0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
25af0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
25b00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25b10 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
25b20 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
25b30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
25b40 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
25b50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25b60 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f  ate > PAGER_UNLO
25b70 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  CK );.  sqlite3P
25b80 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
25b90 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
25ba0 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
25bb0 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
25bc0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
25bd0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
25be0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
25bf0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
25c00 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
25c10 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
25c20 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
25c30 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
25c40 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
25c50 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
25c60 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
25c70 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
25c80 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
25c90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
25ca0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
25cb0 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
25cc0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
25cd0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
25ce0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
25cf0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
25d00 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
25d10 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
25d20 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
25d30 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
25d40 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
25d50 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
25d60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
25d70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
25d80 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65  n opened, ensure
25d90 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62   that the.** sub
25da0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
25db0 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68   open too. If th
25dc0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  e main journal i
25dd0 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74  s not open,.** t
25de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25df0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
25e00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
25e10 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
25e20 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
25e30 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41  g to plan. .** A
25e40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
25e50 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
25e60 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
25e70 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  all to .** sqlit
25e80 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73  e3OsOpen() fails
25e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25ea0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
25eb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25ec0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25ed0 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  _OK;.  if( isOpe
25ee0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
25ef0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
25f00 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
25f10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
25f20 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
25f30 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
25f40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
25f50 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
25f60 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
25f70 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
25f80 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
25f90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
25fa0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
25fb0 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
25fc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
25fd0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
25fe0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
26000 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26010 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
26020 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
26030 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
26040 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
26050 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
26060 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
26070 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26080 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
26090 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
260a0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
260b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
260c0 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
260d0 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
260e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
260f0 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
26100 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
26110 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
26120 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
26130 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
26140 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
26150 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
26160 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
26170 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
26180 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
26190 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
261a0 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
261b0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
261c0 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
261d0 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
261e0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
261f0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
26200 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
26210 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
26220 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
26230 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
26240 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
26250 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
26260 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
26270 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
26280 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
26290 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
262a0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
262b0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
262c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
262d0 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
262e0 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
262f0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
26300 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
26310 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
26320 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
26330 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
26340 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
26350 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
26360 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
26370 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
26380 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
26390 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
263a0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
263b0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
263c0 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
263d0 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
263e0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
263f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26400 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
26410 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26420 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26430 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26450 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
26460 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
26470 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
26480 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
26490 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
264a0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
264b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
264c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
264d0 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
264e0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
264f0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
26500 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
26510 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
26520 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
26530 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26540 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
26550 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
26560 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
26570 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
26580 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26590 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
265a0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
265b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
265c0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
265d0 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
265e0 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
265f0 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
26600 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
26610 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
26620 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26630 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
26640 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73 73 69   it really possi
26650 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72 65 20  ble to get here 
26660 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c 69 64  with dbSizeValid
26670 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20 20 2a  ==0? If not,.  *
26680 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 50 61  * the call to Pa
26690 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 63  gerPagecount() c
266a0 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e 0a 20  an be removed.. 
266b0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
266c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
266d0 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  lid==0 );.  sqli
266e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
266f0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20  t(pPager, 0);.. 
26700 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
26710 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
26720 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
26730 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
26740 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
26750 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  nal==0 ){.    re
26760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26770 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  M;.  }..  /* Ope
26780 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
26790 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
267a0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
267b0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
267c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
267d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
267e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
267f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
26800 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
26810 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
26820 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26840 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
26850 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
26860 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
26870 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
26880 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
26890 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
268a0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
268b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
268c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
268d0 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
268e0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
268f0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
26900 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
26910 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
26920 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
26930 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
26940 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65          );.#ifde
26950 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
26960 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
26970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
26980 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
26990 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
269a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
269b0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
269c0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
269d0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
269e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
269f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
26a00 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
26a10 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
26a20 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
26a30 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
26a40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
26a50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
26a60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26a70 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69  ;.  }...  /* Wri
26a80 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
26a90 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
26aa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26ab0 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74  and open .  ** t
26ac0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
26ad0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
26ae0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
26af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
26b00 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
26b10 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
26b20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
26b30 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
26b40 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
26b50 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
26b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26b70 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
26b80 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
26b90 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
26ba0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
26bb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26bc0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Off = 0;.    pPa
26bd0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
26be0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
26bf0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
26c00 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
26c10 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
26c20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26c30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
26c40 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
26c50 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
26c60 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
26c70 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  r);.  }..  if( r
26c80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26c90 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
26ca0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
26cb0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
26cc0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
26cd0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rnal = 0;.  }.  
26ce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26cf0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
26d00 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
26d10 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
26d20 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
26d30 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
26d40 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
26d50 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
26d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26d70 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
26d80 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
26d90 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
26da0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
26db0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
26dc0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
26dd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26de0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
26df0 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
26e00 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
26e10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
26e20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
26e30 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
26e40 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
26e50 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
26e60 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
26e70 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
26e80 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
26e90 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c  memory file and,
26ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26eb0 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  e is .** opened 
26ec0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65  if it has not be
26ed0 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20  en already. For 
26ee0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
26ef0 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a  , the opening .*
26f00 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * of the journal
26f10 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
26f20 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
26f30 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20   an actual need 
26f40 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20  to .** write to 
26f50 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44  the journal. TOD
26f60 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65  O: Why handle te
26f70 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69  mporary files di
26f80 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a  fferently?.**.**
26f90 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
26fa0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28  file is opened (
26fb0 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
26fc0 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20  ady open), then 
26fd0 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  a.** journal-hea
26fe0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  der is written t
26ff0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
27000 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
27010 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
27020 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
27030 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
27040 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
27050 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
27060 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
27070 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
27080 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
27090 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
270a0 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
270b0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
270c0 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
270d0 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
270e0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
270f0 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
27100 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27110 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
27120 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
27130 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
27140 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
27150 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
27160 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
27170 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
27180 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
27190 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
271a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
271b0 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
271c0 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
271d0 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
271e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
271f0 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
27200 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
27210 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
27220 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
27230 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27240 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27250 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
27260 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  OCK );.  pPager-
27270 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
27280 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
27290 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
272a0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
272b0 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
272c0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
272d0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
272e0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
272f0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
27300 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ile );..    /* O
27310 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
27320 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
27330 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
27340 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
27350 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 74 72  ter.    ** is tr
27360 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
27370 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
27380 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
27390 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
273a0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
273b0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
273c0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
273d0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
273e0 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  SIVE.    ** lock
273f0 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
27400 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
27410 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
27420 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
27430 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
27440 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
27450 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
27460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27470 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
27480 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
27490 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65  VED;.      if( e
274a0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
274b0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
274c0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
274d0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
274e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
274f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72  .    /* If the r
27500 65 71 75 69 72 65 64 20 6c 6f 63 6b 73 20 77 65  equired locks we
27510 72 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  re successfully 
27520 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65 6e 20 74  obtained, open t
27530 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
27540 2a 20 66 69 6c 65 20 61 6e 64 20 77 72 69 74 65  * file and write
27550 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
27560 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 69 74 2e  al-header to it.
27570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27590 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
275a0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
275b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
275c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
275d0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
275e0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ger);.    }.  }e
275f0 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70  lse if( isOpen(p
27600 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
27610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27620 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
27630 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
27640 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
27650 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
27660 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
27670 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
27680 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
27690 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
276a0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
276b0 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
276c0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
276d0 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
276e0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
276f0 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
27700 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
27710 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
27720 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
27730 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
27740 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
27750 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
27760 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
27770 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27780 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
27790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
277a0 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  OrigSize==0 );. 
277b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
277c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
277d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
277e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
277f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
27800 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
27810 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
27820 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
27840 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27850 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) || pPager->jou
27860 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
27870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27880 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27890 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
278a0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
278b0 66 69 65 64 20 29 3b 0a 20 20 20 20 2f 2a 20 49  fied );.    /* I
278c0 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72  gnore any IO err
278d0 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 77  or that occurs w
278e0 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64 5f  ithin pager_end_
278f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20 54  transaction(). T
27900 68 65 0a 20 20 20 20 2a 2a 20 70 75 72 70 6f 73  he.    ** purpos
27910 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
27920 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 69  s to reset the i
27930 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
27940 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
27950 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 49 74  * sub-system. It
27960 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
27970 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  if the journal-f
27980 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f 70 65  ile is not prope
27990 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  rly.    ** final
279a0 69 7a 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ized at this poi
279b0 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69 73 20  nt (since it is 
279c0 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f 75 72  not a valid jour
279d0 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61 79 29  nal file anyway)
279e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 61 67  ..    */.    pag
279f0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
27a00 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
27a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27a20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
27a30 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
27a40 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
27a50 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
27a60 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
27a70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
27a80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
27a90 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
27aa0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
27ab0 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
27ac0 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
27ad0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
27ae0 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
27af0 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
27b00 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
27b10 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
27b20 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
27b30 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
27b40 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
27b50 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
27b60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27b70 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
27b80 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
27b90 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
27ba0 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
27bb0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
27bc0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
27bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
27be0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27bf0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
27c00 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
27c10 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
27c20 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 0a  n.  ** started..
27c30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27c40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
27c50 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
27c60 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
27c70 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69  r has been previ
27c80 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20  ously detected, 
27c90 77 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  we should not be
27ca0 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  .  ** calling th
27cb0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 52 65 70  is routine.  Rep
27cc0 65 61 74 20 74 68 65 20 65 72 72 6f 72 20 66 6f  eat the error fo
27cd0 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 0a 20 20  r robustness..  
27ce0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
27cf0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
27d00 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
27d10 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
27d20 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
27d30 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
27d40 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
27d50 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
27d60 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
27d70 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
27d80 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
27d90 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
27da0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
27db0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
27dc0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
27dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
27de0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
27df0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
27e00 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
27e10 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
27e20 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
27e30 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
27e40 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
27e50 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
27e60 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
27e70 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
27e80 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
27e90 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
27ea0 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
27eb0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
27ec0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
27ed0 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  Pg) ){.    pPage
27ee0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
27ef0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
27f00 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
27f10 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
27f20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
27f30 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
27f40 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
27f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
27f60 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
27f70 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
27f80 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
27f90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67     **.    ** Hig
27fa0 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
27fb0 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
27fc0 6c 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61  lready started a
27fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
27fe0 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73    ** which means
27ff0 20 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69   they have acqui
28000 72 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  red the necessar
28010 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6f 70 65 6e  y locks and open
28020 65 64 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ed.    ** a roll
28030 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 44  back journal.  D
28040 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d  ouble-check to m
28050 61 6b 65 73 20 73 75 72 65 20 74 68 69 73 20 69  akes sure this i
28060 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
28070 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
28080 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
28090 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d  ager, 0, pPager-
280a0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a  >subjInMemory);.
280b0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72 63      if( NEVER(rc
280c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  !=SQLITE_OK) ){.
280d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
280e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
280f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28100 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
28110 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
28120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
28130 46 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  F ){.      asser
28140 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
28150 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 72  urnal );.      r
28160 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
28170 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
28180 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28190 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
281a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
281b0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
281c0 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
281d0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
281e0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
281f0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
28200 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
28210 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
28220 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
28230 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
28240 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
28250 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
28260 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
28270 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
28280 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
28290 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
282a0 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
282b0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73  urnal(pPg) && is
282c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
282d0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
282e0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
282f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
28300 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
28310 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
28320 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
28330 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
28340 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
28350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
28360 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
28370 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
28380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
28390 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
283a0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
283b0 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
283c0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
283d0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
283e0 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
283f0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
28400 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  r) );.        CO
28410 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
28420 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
28430 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28440 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
28450 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
28460 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
28470 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
28480 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
28490 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
284a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
284b0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d  journalOff, pPg-
284c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
284d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
284e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
284f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28500 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
28510 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
28520 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28550 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b  journalOff + 4);
28560 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
28570 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
28580 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28590 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e+4;.        }. 
285a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
285b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
285c0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
285d0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
285e0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
285f0 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
28600 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
28610 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
28620 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
28630 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28640 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
28650 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28660 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
28670 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28680 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
28690 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
286a0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
286b0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
286c0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
286d0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
286e0 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
286f0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
28700 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
28710 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
28720 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
28730 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
28750 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
28760 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
28770 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
28780 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
28790 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
287a0 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
287b0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69  ror occurred whi
287c0 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
287d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
287e0 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
287f0 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
28800 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
28810 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
28820 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
28830 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
28840 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
28850 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
28860 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
28870 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
28880 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
28890 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
288a0 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
288b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
288c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
288d0 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
288e0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
288f0 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
28900 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
28910 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
28920 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
28930 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
28940 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
28950 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
28960 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
28970 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
28980 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
28990 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
289a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
289b0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
289c0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
289d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
289e0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  he .        ** t
289f0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
28a00 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
28a10 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
28a20 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
28a30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28a50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28a60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
28a70 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
28a80 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
28a90 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
28aa0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
28ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28ac0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
28ad0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
28ae0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28af0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
28b00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
28b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
28b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
28b40 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  M );.        rc 
28b50 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
28b60 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
28b70 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
28b80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28ba0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
28bb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
28bc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28bd0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
28be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28bf0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
28c00 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
28c10 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
28c20 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
28c30 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
28c40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
28c50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
28c60 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
28c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28c80 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
28c90 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
28ca0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
28cd0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
28ce0 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
28cf0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
28d00 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
28d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28d20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
28d30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
28d40 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
28d50 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
28d60 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
28d70 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
28d80 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
28d90 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
28da0 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
28db0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
28dc0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
28dd0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
28de0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
28df0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
28e00 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
28e10 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
28e20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
28e30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
28e40 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
28e50 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
28e60 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
28e70 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
28e80 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
28e90 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
28ea0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
28eb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
28ec0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
28ed0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
28ee0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
28ef0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
28f00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
28f10 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
28f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28f30 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
28f40 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
28f50 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69  able. This routi
28f60 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
28f70 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b  d before .** mak
28f80 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ing changes to a
28f90 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65   page. The calle
28fa0 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  r must check the
28fb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a   return value .*
28fc0 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  * of this functi
28fd0 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  on and be carefu
28fe0 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20  l not to change 
28ff0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
29000 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f  less .** this ro
29010 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
29020 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
29030 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
29040 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
29050 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
29060 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
29070 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
29080 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
29090 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
290a0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
290b0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
290c0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
290d0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
290e0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
290f0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
29100 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
29110 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
29120 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
29130 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
29140 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
29150 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
29160 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
29170 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
29180 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ** as appropriat
29190 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
291a0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
291b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
291c0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
291d0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
291e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
291f0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
29200 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
29210 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
29220 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
29230 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
29240 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
29250 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
29260 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
29270 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
29280 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
29290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
292a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
292b0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
292c0 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
292d0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
292e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
292f0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
29300 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
29310 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
29320 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
29330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29340 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
29350 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
29360 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
29370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29380 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
29390 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
293a0 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
293b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
293c0 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
293d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
293e0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
293f0 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
29400 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
29410 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
29420 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
29430 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
29440 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
29450 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
29460 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
29470 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
29480 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
29490 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
294a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
294b0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ync==0 );.    pP
294c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
294d0 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 1;..    /* Thi
294e0 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
294f0 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
29500 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
29510 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
29520 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
29530 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
29540 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
29550 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
29560 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
29570 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
29580 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
29590 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
295a0 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
295b0 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
295c0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
295d0 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69  ) + 1;..    sqli
295e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
295f0 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
29600 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
29610 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
29620 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
29630 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
29640 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
29650 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
29660 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
29670 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
29680 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
29690 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
296a0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
296b0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
296c0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
296d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
296e0 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
296f0 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
29700 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
29710 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
29720 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
29730 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
29740 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29750 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
29760 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
29770 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
29780 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
29790 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
297a0 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
297b0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
297c0 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
297d0 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
297e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
297f0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
29800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29810 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
29820 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
29830 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29850 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29860 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
29870 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29880 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
29890 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
298b0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
298c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
298d0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
298e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
298f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
29900 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
29910 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29920 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29930 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
29940 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
29950 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
29960 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
29970 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
29980 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
29990 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
299a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
299b0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
299c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
299d0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
299e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
299f0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
29a00 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
29a10 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
29a20 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
29a30 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
29a40 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
29a50 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
29a60 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
29a70 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
29a80 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
29a90 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
29aa0 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
29ab0 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
29ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
29ad0 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
29ae0 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
29af0 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
29b00 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
29b10 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
29b20 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
29b30 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
29b40 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
29b50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
29b60 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
29b70 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
29b80 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
29b90 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
29ba0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20  ii=0; ii<nPage; 
29bb0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
29bc0 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
29bd0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
29be0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
29bf0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
29c00 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
29c10 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
29c20 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
29c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
29c40 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
29c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
29c70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
29c80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
29c90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
29ca0 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
29cb0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29cc0 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
29cd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
29ce0 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
29cf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29d10 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
29d20 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
29d30 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
29d40 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
29d50 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
29d60 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
29d70 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
29d80 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
29d90 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
29da0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
29db0 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
29dc0 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
29dd0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
29de0 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
29df0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
29e00 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
29e10 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  RTY;.}.#endif..#
29e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
29e30 43 55 52 45 5f 44 45 4c 45 54 45 0a 2f 2a 0a 2a  CURE_DELETE./*.*
29e40 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
29e50 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
29e60 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
29e70 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
29e80 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
29e90 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
29ea0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
29eb0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
29ec0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
29ed0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
29ee0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
29ef0 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
29f00 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
29f10 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
29f20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
29f30 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
29f40 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
29f50 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
29f60 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
29f70 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
29f80 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
29f90 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
29fa0 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
29fb0 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
29fc0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
29fd0 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
29fe0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
29ff0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
2a000 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
2a010 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
2a020 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
2a030 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
2a040 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
2a050 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
2a060 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
2a070 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
2a080 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
2a090 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2a0a0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
2a0b0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2a0c0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a0d0 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
2a0e0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
2a0f0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
2a100 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
2a110 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
2a120 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
2a130 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
2a140 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
2a150 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
2a160 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
2a170 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
2a180 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
2a190 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2a1a0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
2a1b0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
2a1c0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
2a1d0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
2a1e0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
2a1f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 23 65  .#endif.  }.}.#e
2a200 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2a210 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44  (SQLITE_SECURE_D
2a220 45 4c 45 54 45 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ELETE) */../*.**
2a230 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a240 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
2a250 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
2a260 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a270 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
2a280 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
2a290 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
2a2a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
2a2b0 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
2a2c0 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
2a2d0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2a2e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
2a2f0 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69  irectMode flag i
2a300 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
2a310 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
2a320 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
2a330 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
2a340 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
2a350 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
2a360 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
2a370 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
2a380 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
2a390 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
2a3a0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2a3b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2a3c0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
2a3d0 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d  ** The isDirectM
2a3e0 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c  ode flag may onl
2a3f0 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  y be non-zero if
2a400 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
2a410 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74   compiled.** wit
2a420 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
2a430 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2a440 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
2a450 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a  In this case,.**
2a460 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20   if isDirect is 
2a470 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2a480 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a490 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65   is updated dire
2a4a0 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69  ctly.** by writi
2a4b0 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65  ng an updated ve
2a4c0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
2a4d0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
2a4e0 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  the .** sqlite3O
2a4f0 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  sWrite() functio
2a500 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a510 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2a520 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
2a530 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
2a540 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e  irectMode){.  in
2a550 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a560 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20  ;..  /* Declare 
2a570 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  and initialize c
2a580 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
2a590 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74  'isDirect'. If t
2a5a0 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77  he.  ** atomic-w
2a5b0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a5c0 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20  n is enabled in 
2a5d0 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e  this build, then
2a5e0 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69   isDirect.  ** i
2a5f0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
2a600 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
2a610 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63  d as the isDirec
2a620 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a  tMode parameter.
2a630 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e    ** to this fun
2a640 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2a650 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73  , it is always s
2a660 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  et to zero..  **
2a670 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69  .  ** The idea i
2a680 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74  s that if the at
2a690 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2a6a0 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  ization is not. 
2a6b0 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63   ** enabled at c
2a6c0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2a6d0 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d   compiler can om
2a6e0 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a  it the tests of.
2a6f0 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20    ** 'isDirect' 
2a700 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61  below, as well a
2a710 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c  s the block encl
2a720 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  osed in the.  **
2a730 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29   "if( isDirect )
2a740 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a  " condition..  *
2a750 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2a760 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2a770 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49  RITE.# define DI
2a780 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73  RECT_MODE 0.  as
2a790 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f  sert( isDirectMo
2a7a0 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  de==0 );.  UNUSE
2a7b0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69  D_PARAMETER(isDi
2a7c0 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65  rectMode);.#else
2a7d0 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
2a7e0 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f  _MODE isDirectMo
2a7f0 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  de.#endif..  ass
2a800 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2a810 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
2a820 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ED );.  if( !pPa
2a830 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2a840 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
2a850 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
2a860 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20  PgHdr *pPgHdr;  
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a880 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   Reference to pa
2a890 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20  ge 1 */.    u32 
2a8a0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20  change_counter; 
2a8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2a8c0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68  tial value of ch
2a8d0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
2a8e0 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ld */..    asser
2a8f0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
2a900 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70  File && isOpen(p
2a910 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
2a920 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
2a930 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
2a940 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
2a950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a960 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
2a970 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
2a980 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d  assert( pPgHdr==
2a990 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
2a9a0 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  OK );..    /* If
2a9b0 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65   page one was fe
2a9c0 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c  tched successful
2a9d0 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ly, and this fun
2a9e0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20  ction is not.   
2a9f0 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   ** operating in
2aa00 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61   direct-mode, ma
2aa10 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62  ke page 1 writab
2aa20 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e  le.  When not in
2aa30 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20   .    ** direct 
2aa40 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20  mode, page 1 is 
2aa50 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63  always held in c
2aa60 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74  ache and hence t
2aa70 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20  he PagerGet().  
2aa80 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c    ** above is al
2aa90 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20  ways successful 
2aaa0 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41  - hence the ALWA
2aab0 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45  YS on rc==SQLITE
2aac0 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _OK..    */.    
2aad0 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45  if( !DIRECT_MODE
2aae0 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53   && ALWAYS(rc==S
2aaf0 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
2ab00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ab10 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
2ab20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2ab30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ab40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
2ab50 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2ab60 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
2ab70 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
2ab80 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
2ab90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
2aba0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
2abb0 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
2abc0 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
2abd0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2abe0 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
2abf0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
2ac00 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
2ac10 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
2ac20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
2ac30 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
2ac40 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
2ac50 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
2ac60 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
2ac70 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52 45  /.      if( DIRE
2ac80 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20  CT_MODE ){.     
2ac90 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
2aca0 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44  Buf = pPgHdr->pD
2acb0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ata;.        ass
2acc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46  ert( pPager->dbF
2acd0 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20  ileSize>0 );.   
2ace0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2acf0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2ad00 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
2ad10 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
2ad20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2ad30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ad50 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2ad60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2ad70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ad80 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
2ad90 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
2ada0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2adb0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
2adc0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
2add0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
2ade0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
2adf0 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
2ae00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
2ae10 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69  ync the pager fi
2ae20 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73  le to disk. This
2ae30 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2ae40 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a  in-memory files.
2ae50 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68  ** or pages with
2ae60 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
2ae70 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  c flag set..**.*
2ae80 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2ae90 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   or called on a 
2aea0 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
2aeb0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74  it is a no-op, t
2aec0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
2aed0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2aee0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  K. Otherwise, an
2aef0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2af00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
2af10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
2af20 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2af30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2af60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61  turn code */.  a
2af70 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
2af80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2af90 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
2afa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2afb0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
2afc0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2afd0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2afe0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
2aff0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b000 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
2b010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2b020 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
2b030 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
2b040 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
2b050 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
2b060 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
2b070 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
2b080 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
2b090 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
2b0a0 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
2b0b0 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
2b0c0 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
2b0d0 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
2b0e0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
2b0f0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
2b100 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
2b110 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
2b120 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a  sures that:.**.*
2b130 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2b140 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
2b150 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65  ounter is update
2b160 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f  d,.**   * the jo
2b170 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2b180 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d  (unless the atom
2b190 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2b1a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a  ation is used),.
2b1b0 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79  **   * all dirty
2b1c0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
2b1d0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2b1e0 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a  se file, .**   *
2b1f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b200 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
2b210 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61  (if required), a
2b220 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  nd.**   * the da
2b230 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
2b240 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ed. .**.** The o
2b250 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72  nly thing that r
2b260 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
2b270 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b280 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20   is to finalize 
2b290 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75  .** (delete, tru
2b2a0 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
2b2b0 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29  e first part of)
2b2c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b2d0 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65  e (or .** delete
2b2e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2b2f0 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
2b300 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
2b310 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
2b320 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
2b330 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
2b340 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
2b350 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
2b360 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
2b370 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
2b380 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  call..**.** If t
2b390 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
2b3a0 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73  er - noSync - is
2b3b0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2b3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2b3d0 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73  self.** is not s
2b3e0 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  ynced. The calle
2b3f0 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  r must call sqli
2b400 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64  te3PagerSync() d
2b410 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79  irectly to.** sy
2b420 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2b430 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
2b440 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54  ing CommitPhaseT
2b450 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74  wo() to delete t
2b460 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2b470 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
2b480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b490 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
2b4a0 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ne(.  Pager *pPa
2b4b0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
2b4c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2b4d0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
2b4e0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
2b4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2b500 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d   not NULL, the m
2b510 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2b520 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79  me */.  int noSy
2b530 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
2b540 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2b550 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e  to omit the xSyn
2b560 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  c on the db file
2b570 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2b580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2b590 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b5a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2b5b0 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2b5c0 69 73 20 6e 65 76 65 72 20 73 65 74 20 69 66 20  is never set if 
2b5d0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46  journal_mode=OFF
2b5e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2b5f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2b600 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2b610 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67  MODE_OFF || pPag
2b620 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
2b630 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  0 );..  /* If a 
2b640 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75  prior error occu
2b650 72 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  rred, this routi
2b660 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
2b670 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c 4c 42 41   called.  ROLLBA
2b680 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 61  CK.  ** is the a
2b690 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 70 6f  ppropriate respo
2b6a0 6e 73 65 20 74 6f 20 61 6e 20 65 72 72 6f 72 2c  nse to an error,
2b6b0 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20 20 47 75   not COMMIT.  Gu
2b6c0 61 72 64 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a  ard against.  **
2b6d0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 73 20 62   coding errors b
2b6e0 79 20 72 65 70 65 61 74 69 6e 67 20 74 68 65 20  y repeating the 
2b6f0 70 72 69 6f 72 20 65 72 72 6f 72 2e 20 2a 2f 0a  prior error. */.
2b700 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2b710 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2b720 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2b730 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
2b740 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
2b750 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
2b760 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
2b770 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
2b780 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2b790 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
2b7a0 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66  >dbSize));..  if
2b7b0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
2b7c0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2b7d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2b7e0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2b7f0 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
2b800 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2b810 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
2b820 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
2b830 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2b840 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73  alled, it is mos
2b850 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f  tly a no-op.  Ho
2b860 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a  wever, any.    *
2b870 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67  * backup in prog
2b880 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65  ress needs to be
2b890 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20   restarted..    
2b8a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  */.    sqlite3Ba
2b8b0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
2b8c0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
2b8d0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
2b8e0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
2b8f0 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d  YNCED && pPager-
2b900 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a  >dbModified ){..
2b910 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
2b920 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74  wing block updat
2b930 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
2b940 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68  unter. Exactly h
2b950 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ow it.    ** doe
2b960 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
2b970 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
2b980 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2b990 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
2b9a0 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
2b9b0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2b9c0 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
2b9d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
2b9e0 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75  s the .    ** ru
2b9f0 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
2ba00 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
2ba10 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion: .    **.   
2ba20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c   **    * The fil
2ba30 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
2ba40 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2ba50 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
2ba60 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
2ba70 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
2ba80 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a  size, and .    *
2ba90 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d  *    * This comm
2baa0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
2bab0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
2bac0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
2bad0 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63      **    * Exac
2bae0 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
2baf0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
2bb00 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
2bb10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2bb20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2bb30 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2bb40 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
2bb50 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2bb60 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
2bb70 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bb80 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
2bb90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2bba0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2bbb0 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  nge.    ** count
2bbc0 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
2bbd0 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
2bbe0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
2bbf0 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
2bc00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c    ** is not appl
2bc10 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
2bc20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c  ransaction, call
2bc30 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2bc40 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74  reate().    ** t
2bc50 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
2bc60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
2bc70 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63   actually been c
2bc80 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c  reated, then cal
2bc90 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  l.    ** pager_i
2bca0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bcb0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2bcc0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2bcd0 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20   in indirect.   
2bce0 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a   ** mode. .    *
2bcf0 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  *.    ** Otherwi
2bd00 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
2bd10 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
2bd20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
2bd30 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74  icable,.    ** t
2bd40 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
2bd50 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bd60 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2bd70 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2bd80 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65  .    ** in 'dire
2bd90 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
2bda0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2bdb0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
2bdc0 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  er be.    ** cre
2bdd0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
2bde0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
2bdf0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2be00 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2be10 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70  ITE.    PgHdr *p
2be20 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
2be30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2be40 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
2be50 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2be60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2be70 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  F );.    if( !zM
2be80 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
2be90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2bea0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2beb0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
2bec0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
2bed0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
2bee0 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
2bef0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20  ->dbFileSize.   
2bf00 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20    && (0==(pPg = 
2bf10 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2bf20 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2bf30 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70  PCache)) || 0==p
2bf40 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  Pg->pDirty).    
2bf50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
2bf60 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
2bf70 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
2bf80 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
2bf90 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
2bfa0 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
2bfb0 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
2bfc0 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ify the in-memor
2bfd0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
2bfe0 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20   of page 1 .    
2bff0 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
2c000 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
2c010 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
2c020 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
2c030 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63   .      ** direc
2c040 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
2c050 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
2c060 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
2c070 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
2c080 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
2c090 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
2c0a0 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
2c0b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2c0c0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c0d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c0e0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ger, 1);.    }el
2c0f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
2c100 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2c110 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2c120 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2c130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c140 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c150 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c160 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
2c170 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c       }.    }.#el
2c180 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  se.    rc = page
2c190 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c1a0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
2c1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2c1c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c1d0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2c1e0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2c1f0 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
2c200 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
2c210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
2c220 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
2c230 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69  pages.    ** bei
2c240 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
2c250 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
2c260 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
2c270 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
2c280 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
2c290 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2c2a0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2c2b0 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
2c2c0 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e  ** Before readin
2c2d0 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68  g the pages with
2c2e0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61   page numbers la
2c2f0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
2c300 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61     ** current va
2c310 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
2c320 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20  ize, set dbSize 
2c330 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
2c340 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74  e.    ** that it
2c350 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
2c360 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
2c370 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2c380 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c  , the.    ** cal
2c390 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2c3a0 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a  erGet() return z
2c3b0 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74  eroed pages inst
2c3c0 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72  ead of .    ** r
2c3d0 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
2c3e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c3f0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2c400 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
2c410 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
2c420 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
2c430 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
2c440 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76      ** block nev
2c450 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e  er runs if journ
2c460 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20  al_mode=OFF..   
2c470 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2c480 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c490 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2c4a0 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
2c4b0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2c4c0 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50 61     && ALWAYS(pPa
2c4d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c4e0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2c4f0 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b 0a  ODE_OFF).    ){.
2c500 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20        Pgno i;   
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c530 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2c540 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  able */.      co
2c550 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
2c560 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
2c570 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
2c580 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
2c590 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
2c5a0 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
2c5b0 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  ->dbSize;       
2c5c0 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67  /* Database imag
2c5d0 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20  e size */ .     
2c5e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2c5f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
2c600 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Size;.      for(
2c610 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d   i=dbSize+1; i<=
2c620 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2c630 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
2c640 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
2c650 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2c660 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
2c670 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
2c680 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
2c690 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2c6a0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a      /* Page to j
2c6b0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20  ournal */.      
2c6c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c6d0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2c6e0 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
2c6f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c700 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2c710 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c720 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2c730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c740 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
2c750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c760 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2c770 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2c780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c790 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2c7a0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2c7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
2c7c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
2c7d0 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
2c7e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2c7f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
2c800 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2c810 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
2c820 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d  nal file. If a m
2c830 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f  aster .    ** jo
2c840 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2c850 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2c860 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2c870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20  journal file, . 
2c880 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73     ** or if zMas
2c890 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20  ter is NULL (no 
2c8a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c  master journal),
2c8b0 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
2c8c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2c8d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
2c8e0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
2c8f0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
2c900 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2c910 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2c920 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2c930 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  xit;..    /* Syn
2c940 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2c950 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
2c960 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2c970 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
2c980 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73     ** used, this
2c990 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63   call will not c
2c9a0 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  reate the journa
2c9b0 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72  l file or perfor
2c9c0 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61  m any.    ** rea
2c9d0 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  l IO..    */.   
2c9e0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2c9f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
2ca00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ca10 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2ca20 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2ca30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
2ca40 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2ca50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ca60 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  e. */.    rc = p
2ca70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2ca80 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
2ca90 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2caa0 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
2cab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2cad0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2cae0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
2caf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  .      goto comm
2cb00 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cb10 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
2cb20 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
2cb30 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
2cb40 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  he);..    /* If 
2cb50 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
2cb60 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
2cb70 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
2cb80 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
2cb90 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
2cba0 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
2cbb0 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
2cbc0 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
2cbd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
2cbe0 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67  er->dbSize!=pPag
2cbf0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2cc00 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65  {.      Pgno nNe
2cc10 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  w = pPager->dbSi
2cc20 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62  ze - (pPager->db
2cc30 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  Size==PAGER_MJ_P
2cc40 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
2cc50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cc60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2cc70 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2cc80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
2cc90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
2cca0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  nNew);.      if(
2ccb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ccc0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2ccd0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2cce0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c   }..    /* Final
2ccf0 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  ly, sync the dat
2cd00 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2cd10 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2cd20 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
2cd30 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
2cd40 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2cd50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2cd60 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
2cd70 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
2cd80 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
2cd90 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
2cda0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2cdb0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
2cdc0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
2cdd0 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
2cde0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2cdf0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
2ce00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
2ce10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ce20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
2ce30 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
2ce40 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
2ce50 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
2ce60 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2ce70 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
2ce80 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
2ce90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
2cea0 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
2ceb0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
2cec0 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
2ced0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
2cee0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
2cef0 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
2cf00 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
2cf10 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
2cf20 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2cf30 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
2cf40 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2cf50 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
2cf60 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2cf70 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
2cf80 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
2cf90 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
2cfa0 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
2cfb0 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
2cfc0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
2cfd0 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
2cfe0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
2cff0 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
2d000 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d010 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
2d020 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2d030 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2d040 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
2d050 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d060 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
2d070 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
2d080 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
2d090 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
2d0a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2d0b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d0c0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
2d0d0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
2d0e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d0f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2d110 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2d120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2d130 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2d140 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
2d150 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
2d160 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
2d170 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2d180 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
2d190 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
2d1a0 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
2d1b0 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
2d1c0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
2d1d0 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
2d1e0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
2d1f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2d200 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2d210 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
2d220 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
2d230 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2d240 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2d250 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2d260 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
2d270 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
2d280 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
2d290 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
2d2a0 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
2d2b0 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
2d2c0 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
2d2d0 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74  s defensive test
2d2e0 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20   here anyway..  
2d2f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2d300 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
2d310 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72  ER_RESERVED) ) r
2d320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d330 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74  OR;..  /* An opt
2d340 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
2d350 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
2d360 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
2d370 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
2d380 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2d390 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
2d3a0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2d3b0 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
2d3c0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
2d3d0 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
2d3e0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2d3f0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2d400 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
2d410 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2d420 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
2d430 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
2d440 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
2d450 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
2d460 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
2d470 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
2d480 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
2d490 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
2d4a0 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
2d4b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2d4c0 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
2d4d0 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
2d4e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2d4f0 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
2d500 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
2d510 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
2d520 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
2d530 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
2d540 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2d550 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
2d560 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
2d570 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
2d580 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
2d590 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
2d5a0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  =0 && pPager->ex
2d5b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
2d5c0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2d5d0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2d5e0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2d5f0 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  T.  ){.    asser
2d600 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2d610 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
2d620 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
2d630 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d640 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41  TE_OK;.  }..  PA
2d650 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49  GERTRACE(("COMMI
2d660 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
2d670 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
2d680 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2d690 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
2d6a0 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
2d6b0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2d6c0 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  d );.  rc = page
2d6d0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2d6e0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2d6f0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2d700 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2d710 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2d720 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
2d730 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54  k all changes. T
2d740 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
2d750 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
2d760 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a  SHARED mode..**.
2d770 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2d780 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61   performs two ta
2d790 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  sks:.**.**   1) 
2d7a0 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  It rolls back th
2d7b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2d7c0 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61  restoring all da
2d7d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2d7e0 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f  .**      in-memo
2d7f0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74  ry cache pages t
2d800 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79  o the state they
2d810 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68   were in when th
2d820 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2d830 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64        was opened
2d840 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74  , and.**   2) It
2d850 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
2d860 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20  ournal file, so 
2d870 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75  that it is not u
2d880 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20  sed for hot.**  
2d890 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20      rollback at 
2d8a0 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  any point in the
2d8b0 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73   future..**.** s
2d8c0 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
2d8d0 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63  llowing qualific
2d8e0 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  ations:.**.** * 
2d8f0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2d900 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  ile is not yet o
2d910 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
2d920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d930 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79  ,.**   then only
2d940 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (2) is performe
2d950 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2d960 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72  there is no jour
2d970 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f  nal file.**   to
2d980 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a   roll back..**.*
2d990 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72  * * If in an err
2d9a0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2d9b0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  han SQLITE_FULL,
2d9c0 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69   then task (1) i
2d9d0 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65  s .**   performe
2d9e0 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  d. If successful
2d9f0 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61  , task (2). Rega
2da00 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
2da10 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69  tcome.**   of ei
2da20 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20  ther, the error 
2da30 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
2da40 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
2da50 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  the caller.**   
2da60 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c  (i.e. either SQL
2da70 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
2da80 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
2da90 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67  .** * If the pag
2daa0 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52  er is in PAGER_R
2dab0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
2dac0 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
2dad0 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72   Whether.**   or
2dae0 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63   not (1) is succ
2daf0 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74  ussful, also att
2db00 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63  empt (2). If suc
2db10 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
2db20 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  **   SQLITE_OK. 
2db30 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72  Otherwise, enter
2db40 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2db50 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2db60 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f  first .**   erro
2db70 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72  r code encounter
2db80 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ed. .**.**   In 
2db90 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2dba0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
2dbb0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  t the database w
2dbc0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a  as written to. .
2dbd0 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20  **   So is safe 
2dbe0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2dbf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65  journal file eve
2dc00 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63  n if the playbac
2dc10 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69  k .**   (operati
2dc20 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f  on 1) failed. Ho
2dc30 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20  wever the pager 
2dc40 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65  must enter the e
2dc50 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
2dc60 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
2dc70 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
2dc80 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73   cache are now s
2dc90 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20  uspect..**.** * 
2dca0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50  Finally, if in P
2dcb0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73  AGER_EXCLUSIVE s
2dcc0 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
2dcd0 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20  pt (1). Only.** 
2dce0 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66    attempt (2) if
2dcf0 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
2dd00 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ul. Return SQLIT
2dd10 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2dd20 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69  ul,.**   otherwi
2dd30 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  se enter the err
2dd40 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2dd50 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
2dd60 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  de from the .** 
2dd70 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74    failing operat
2dd80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ion..**.**   In 
2dd90 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61  this case the da
2dda0 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
2ddb0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2ddc0 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a  n to. So if the.
2ddd0 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70  **   playback op
2dde0 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2ddf0 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64  succeed it would
2de00 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
2de10 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68  finalize.**   th
2de20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2de30 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  It needs to be l
2de40 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
2de50 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a  system so that.*
2de60 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  *   some other p
2de70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69  rocess can use i
2de80 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  t to restore the
2de90 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20   database state 
2dea0 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75  (by.**   hot-jou
2deb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
2dec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2ded0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
2dee0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2def0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2df00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2df10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2df20 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43  e */.  PAGERTRAC
2df30 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E(("ROLLBACK %d\
2df40 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2df50 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70 50  er)));.  if( !pP
2df60 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2df70 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
2df80 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2df90 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
2dfa0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2dfb0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2dfc0 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
2dfd0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2dfe0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
2dff0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
2e000 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
2e010 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2e020 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
2e030 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
2e040 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
2e050 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2e060 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2e070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2e080 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2e090 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2e0a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
2e0b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2e0c0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e0d0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
2e0e0 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
2e0f0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2e100 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2e110 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
2e120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e130 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
2e140 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
2e150 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e160 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e170 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e180 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
2e190 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
2e1a0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
2e1b0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2e1c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2e1d0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
2e1e0 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
2e1f0 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
2e200 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2e210 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
2e220 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
2e230 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
2e240 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
2e250 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
2e260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2e270 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
2e280 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
2e290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e2a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2e2b0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2e2c0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
2e2d0 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
2e2e0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
2e2f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
2e300 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
2e310 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
2e320 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
2e330 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
2e340 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2e350 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
2e360 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e370 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2e380 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2e390 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2e3a0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
2e3b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e3c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e3d0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2e3e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e3f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e400 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2e410 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2e420 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2e430 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e440 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2e450 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
2e460 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e470 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
2e480 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
2e490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2e4a0 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
2e4b0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2e4c0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
2e4d0 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
2e4e0 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
2e4f0 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
2e500 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
2e510 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
2e520 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e530 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2e540 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
2e550 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2e560 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
2e570 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2e580 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
2e590 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
2e5a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e5b0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
2e5c0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f  r->dbSizeValid ?
2e5d0 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
2e5e0 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b  bSize : -1;.  a[
2e5f0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
2e600 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
2e610 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2e620 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
2e630 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
2e640 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
2e650 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
2e660 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
2e670 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
2e680 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
2e690 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
2e6a0 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
2e6b0 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
2e6c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2e6d0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2e6e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
2e6f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e700 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67  PagerIsMemdb(Pag
2e710 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e720 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a  eturn MEMDB;.}..
2e730 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2e740 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65   there are at le
2e750 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73  ast nSavepoint s
2e760 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20  avepoints open. 
2e770 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  If there are.** 
2e780 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74  currently less t
2e790 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20  han nSavepoints 
2e7a0 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20  open, then open 
2e7b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
2e7c0 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b  points.** to mak
2e7d0 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65  e up the differe
2e7e0 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62  nce. If the numb
2e7f0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
2e800 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65   is already.** e
2e810 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69  qual to nSavepoi
2e820 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  nt, then this fu
2e830 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2e840 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  p..**.** If a me
2e850 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2e860 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
2e870 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
2e880 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   If an error .**
2e890 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
2e8a0 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f  ening the sub-jo
2e8b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
2e8c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2e8d0 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  e is.** returned
2e8e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2e8f0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
2e900 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
2e910 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
2e920 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76  pPager, int nSav
2e930 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
2e940 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e960 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2e970 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ode */.  int nCu
2e980 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  rrent = pPager->
2e990 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
2e9a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
2e9b0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2e9c0 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61  ts */..  if( nSa
2e9d0 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74  vepoint>nCurrent
2e9e0 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
2e9f0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
2ea00 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2ea30 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2ea40 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
2ea50 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *aNew;         
2ea60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2ea70 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2ea80 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20 20  t array */..    
2ea90 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65 20  /* Either there 
2eaa0 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f 75  is no active jou
2eab0 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62 2d  rnal or the sub-
2eac0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2ead0 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a  or .    ** the j
2eae0 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73  ournal is always
2eaf0 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
2eb00 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
2eb10 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2eb20 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65 6e  int==0 || isOpen
2eb30 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2eb40 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  |.            pP
2eb50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2eb60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2eb70 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a  MODE_MEMORY );..
2eb80 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
2eb90 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
2eba0 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
2ebb0 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
2ebc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
2ebd0 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
2ebe0 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
2ebf0 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
2ec00 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
2ec10 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
2ec20 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2ec30 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
2ec40 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
2ec50 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
2ec60 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
2ec70 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
2ec80 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
2ec90 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
2eca0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2ecb0 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
2ecc0 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
2ecd0 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
2ece0 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
2ecf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ed00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2ed10 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
2ed20 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
2ed30 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
2ed40 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
2ed50 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
2ed60 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2ed70 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20  point = aNew;.  
2ed80 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
2ed90 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e  oint = nSavepoin
2eda0 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  t;..    /* Popul
2edb0 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76  ate the PagerSav
2edc0 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
2edd0 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64  s just allocated
2ede0 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
2edf0 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61  nCurrent; ii<nSa
2ee00 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
2ee10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2ee20 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2ee30 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  d );.      aNew[
2ee40 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67  ii].nOrig = pPag
2ee50 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2ee60 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
2ee70 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 41 4c 57  ger->jfd) && ALW
2ee80 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  AYS(pPager->jour
2ee90 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
2eea0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2eeb0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
2eec0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2eed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eee0 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2eef0 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
2ef00 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
2ef10 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
2ef20 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
2ef30 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
2ef40 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
2ef50 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
2ef60 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2ef70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2ef80 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77  .      if( !aNew
2ef90 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2efa0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t ){.        ret
2efb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2efc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2efd0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2efe0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2eff0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2f000 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  dy opened. */.  
2f010 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2f020 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2f030 20 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74     assertTruncat
2f040 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
2f050 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
2f060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f070 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f080 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
2f090 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28  ack or release (
2f0a0 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f  commit) a savepo
2f0b0 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65  int..** The save
2f0c0 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65  point to release
2f0d0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
2f0e0 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73  d not be the mos
2f0f0 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63  t recently .** c
2f100 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74  reated savepoint
2f110 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
2f120 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65  r op is always e
2f130 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
2f140 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45  ROLLBACK or SAVE
2f150 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a  POINT_RELEASE..*
2f160 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  * If it is SAVEP
2f170 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
2f180 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64  en release and d
2f190 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
2f1a0 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64  oint with.** ind
2f1b0 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49  ex iSavepoint. I
2f1c0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2f1d0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
2f1e0 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   rollback all ch
2f1f0 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61  anges.** that ha
2f200 76 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63  ve occurred sinc
2f210 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2f220 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72  savepoint was cr
2f230 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eated..**.** The
2f240 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f   savepoint to ro
2f250 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2f260 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  e is identified 
2f270 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a  by parameter .**
2f280 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76   iSavepoint. A v
2f290 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20  alue of 0 means 
2f2a0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
2f2b0 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
2f2c0 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69  point.** (the fi
2f2d0 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41 20  rst created). A 
2f2e0 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e  value of (Pager.
2f2f0 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65  nSavepoint-1) me
2f300 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f  ans operate.** o
2f310 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
2f320 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 76 65  tly created save
2f330 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70  point. If iSavep
2f340 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
2f350 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e  than.** (Pager.n
2f360 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68  Savepoint-1), th
2f370 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2f380 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2f390 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76 65  ** If a negative
2f3a0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
2f3b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f3c0 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  n, then the curr
2f3d0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
2f3e0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
2f3f0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
2f400 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rent to calling 
2f410 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2f420 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75  Rollback() becau
2f430 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2f440 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e   does not termin
2f450 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73  ate.** the trans
2f460 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b  action or unlock
2f470 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
2f480 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20  t just restores 
2f490 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
2f4a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f4b0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
2f4c0 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49   state. .**.** I
2f4d0 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20  n any case, all 
2f4e0 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20  savepoints with 
2f4f0 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
2f500 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74   than iSavepoint
2f510 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79   .** are destroy
2f520 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ed. If this is a
2f530 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69   release operati
2f540 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  on (op==SAVEPOIN
2f550 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74  T_RELEASE),.** t
2f560 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53  hen savepoint iS
2f570 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f  avepoint is also
2f580 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
2f590 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f5a0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2f5b0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d  E_NOMEM if a mem
2f5c0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
2f5d0 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49  ails,.** or an I
2f5e0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
2f5f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2f600 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  rs while rolling
2f610 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65   back a .** save
2f620 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72  point. If no err
2f630 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  ors occur, SQLIT
2f640 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f650 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
2f660 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
2f670 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f680 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
2f690 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
2f6a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2f6b0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
2f6c0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
2f6d0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
2f6e0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73  ROLLBACK );.  as
2f6f0 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
2f700 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  >=0 || op==SAVEP
2f710 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
2f720 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f 69  ..  if( iSavepoi
2f730 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  nt<pPager->nSave
2f740 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  point ){.    int
2f750 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2f760 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2f770 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
2f780 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f  nNew;          /
2f790 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61  * Number of rema
2f7a0 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73  ining savepoints
2f7b0 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20   after this op. 
2f7c0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  */..    /* Figur
2f7d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73  e out how many s
2f7e0 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73  avepoints will s
2f7f0 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61  till be active a
2f800 66 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a  fter this.    **
2f810 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72   operation. Stor
2f820 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20  e this value in 
2f830 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20  nNew. Then free 
2f840 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69  resources associ
2f850 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74  ated .    ** wit
2f860 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  h any savepoints
2f870 20 74 68 61 74 20 61 72 65 20 64 65 73 74 72 6f   that are destro
2f880 79 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  yed by this oper
2f890 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2f8a0 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f    nNew = iSavepo
2f8b0 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50  int + (op==SAVEP
2f8c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  OINT_ROLLBACK);.
2f8d0 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b      for(ii=nNew;
2f8e0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
2f8f0 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
2f900 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
2f910 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
2f920 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
2f930 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
2f940 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
2f950 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
2f960 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  New;..    /* If 
2f970 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
2f980 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c  ck operation, pl
2f990 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63 69  ayback the speci
2f9a0 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  fied savepoint..
2f9b0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
2f9c0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69  s a temp-file, i
2f9d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2f9e0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2f9f0 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e  ile has.    ** n
2fa00 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2fa10 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2fa20 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
2fa30 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20   no changes to. 
2fa40 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2fa50 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20  se file, so the 
2fa60 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69  playback operati
2fa70 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  on can be skippe
2fa80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2fa90 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
2faa0 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69 73 4f 70  ROLLBACK && isOp
2fab0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2fac0 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61  ){.      PagerSa
2fad0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
2fae0 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f  int = (nNew==0)?
2faf0 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  0:&pPager->aSave
2fb00 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20  point[nNew-1];. 
2fb10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2fb20 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
2fb30 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f  (pPager, pSavepo
2fb40 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  int);.      asse
2fb50 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  rt(rc!=SQLITE_DO
2fb60 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  NE);.    }.  .  
2fb70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2fb80 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65  a release of the
2fb90 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
2fba0 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a  oint, truncate .
2fbb0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
2fbc0 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62  ournal to zero b
2fbd0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f  ytes in size. */
2fbe0 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30  .    if( nNew==0
2fbf0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
2fc00 54 5f 52 45 4c 45 41 53 45 20 26 26 20 69 73 4f  T_RELEASE && isO
2fc10 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2fc20 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
2fc30 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2fc40 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2fc50 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
2fc60 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
2fc70 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
2fc80 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20  >nSubRec = 0;.  
2fc90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2fca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2fcb0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
2fcc0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
2fcd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
2fce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
2fcf0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
2fd00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2fd10 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2fd20 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
2fd30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2fd40 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66   VFS structure f
2fd50 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  or the pager..*/
2fd60 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76  .const sqlite3_v
2fd70 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  fs *sqlite3Pager
2fd80 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  Vfs(Pager *pPage
2fd90 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2fda0 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a  ger->pVfs;.}../*
2fdb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
2fdc0 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  ile handle for t
2fdd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fde0 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2fdf0 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20  ith the pager.  
2fe00 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72  This might retur
2fe10 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69  n NULL if the fi
2fe20 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65  le has.** not ye
2fe30 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a  t been opened..*
2fe40 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  /.sqlite3_file *
2fe50 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2fe60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2fe70 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2fe80 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->fd;.}../*.** R
2fe90 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
2fea0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
2feb0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
2fec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
2fed0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
2fee0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
2fef0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2ff00 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
2ff10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ff20 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
2ff30 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
2ff40 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
2ff50 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
2ff60 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
2ff70 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
2ff80 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
2ff90 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
2ffa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ffb0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2ffc0 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64  >noSync;.}..#ifd
2ffd0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
2ffe0 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  DEC./*.** Set or
2fff0 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f   retrieve the co
30000 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
30010 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  er.*/.static voi
30020 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
30030 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
30040 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
30050 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
30060 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
30070 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
30080 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
30090 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  ,int,int),.  voi
300a0 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
300b0 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a  void*),.  void *
300c0 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20  pCodec.){.  if( 
300d0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
300e0 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
300f0 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
30100 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65  pCodec);.  pPage
30110 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67  r->xCodec = pPag
30120 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20  er->memDb ? 0 : 
30130 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
30140 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
30150 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   = xCodecSizeChn
30160 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  g;.  pPager->xCo
30170 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63  decFree = xCodec
30180 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Free;.  pPager->
30190 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b  pCodec = pCodec;
301a0 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  .  pagerReportSi
301b0 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74  ze(pPager);.}.st
301c0 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74  atic void *sqlit
301d0 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63 28  e3PagerGetCodec(
301e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
301f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
30200 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69  >pCodec;.}.#endi
30210 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
30220 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30230 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
30240 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
30250 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
30260 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
30270 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
30280 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
30290 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
302a0 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70   located at.** p
302b0 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61  gno (which we ca
302c0 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67  ll pPgOld) thoug
302d0 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61  h that page is a
302e0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20  llowed to be.** 
302f0 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68  in cache.  If th
30300 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
30310 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  y located at pgn
30320 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
30330 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
30340 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
30350 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
30360 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
30370 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
30380 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
30390 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
303a0 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
303b0 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
303c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
303d0 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
303e0 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
303f0 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
30400 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
30410 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
30420 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
30430 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
30440 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
30450 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
30460 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
30470 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
30480 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
30490 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
304a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
304b0 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
304c0 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
304d0 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
304e0 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
304f0 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
30500 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
30510 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
30520 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
30530 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a  n is active)..**
30540 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74  .** If the fourt
30550 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f  h argument, isCo
30560 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72  mmit, is non-zer
30570 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
30580 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f  e is being.** mo
30590 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ved as part of a
305a0 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61   database reorga
305b0 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65  nization just be
305c0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
305d0 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e  tion .** is bein
305e0 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20  g committed. In 
305f0 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73  this case, it is
30600 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
30610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
30620 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72  ge .** pPg refer
30630 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s to will not be
30640 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69   written to agai
30650 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
30660 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
30670 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
30680 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
30690 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
306a0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
306b0 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
306c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
306d0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
306e0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
306f0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
30700 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
30710 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
30720 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d  pgno, int isComm
30730 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  it){.  PgHdr *pP
30740 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  gOld;           
30750 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
30760 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
30770 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
30780 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20  dSyncPgno = 0;  
30790 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75       /* Old valu
307a0 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  e of pPg->pgno, 
307b0 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  if sync is requi
307c0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  red */.  int rc;
307d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
307f0 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  code */.  Pgno o
30800 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  rigPgno;        
30810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
30820 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  iginal page numb
30830 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
30840 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
30850 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74  .  /* In order t
30860 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  o be able to rol
30870 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d  lback, an in-mem
30880 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d 75 73  ory database mus
30890 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74  t journal.  ** t
308a0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 6d  he page we are m
308b0 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f  oving from..  */
308c0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
308d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
308e0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
308f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30900 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
30910 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
30920 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
30930 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
30940 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
30950 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
30960 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
30970 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
30980 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
30990 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
309a0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
309b0 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
309c0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
309d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
309e0 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
309f0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
30a00 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
30a10 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
30a20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
30a30 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
30a40 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
30a50 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
30a60 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
30a70 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
30a80 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
30a90 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
30aa0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
30ab0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
30ac0 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
30ad0 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
30ae0 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
30af0 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
30b00 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
30b10 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
30b20 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
30b30 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
30b40 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
30b50 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
30b60 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
30b70 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
30b80 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
30b90 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
30ba0 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
30bb0 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
30bc0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
30bd0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
30be0 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
30bf0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
30c00 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26 26  GHDR_DIRTY.   &&
30c10 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
30c20 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c  e(pPg).   && SQL
30c30 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75  ITE_OK!=(rc = su
30c40 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
30c50 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
30c60 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
30c70 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20  GERTRACE(("MOVE 
30c80 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
30c90 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
30ca0 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
30cb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
30cc0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67   pPg->pgno, (pPg
30cd0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
30ce0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67  ED_SYNC)?1:0, pg
30cf0 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  no));.  IOTRACE(
30d00 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
30d10 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
30d20 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
30d30 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
30d40 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
30d50 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70  ync()ed before p
30d60 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61  age pPg->pgno ca
30d70 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  n.  ** be writte
30d80 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d  n to, store pPg-
30d90 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76  >pgno in local v
30da0 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63  ariable needSync
30db0 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Pgno..  **.  ** 
30dc0 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20  If the isCommit 
30dd0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
30de0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
30df0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20   remember that. 
30e00 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
30e10 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
30e20 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
30e30 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70  base page pPg->p
30e40 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65  gno .  ** can be
30e50 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
30e60 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
30e70 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
30e80 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e   to write to it.
30e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67  .  */.  if( (pPg
30ea0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
30eb0 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43  ED_SYNC) && !isC
30ec0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65  ommit ){.    nee
30ed0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
30ee0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
30ef0 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
30f00 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
30f10 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
30f20 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  gSize );.    ass
30f30 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
30f40 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
30f50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30f60 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
30f70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
30f80 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
30f90 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
30fa0 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
30fb0 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
30fc0 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
30fd0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
30fe0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
30ff0 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
31000 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
31010 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
31020 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
31030 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
31040 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
31050 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
31060 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
31070 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53  &= ~PGHDR_NEED_S
31080 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20  YNC;.  pPgOld = 
31090 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
310a0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
310b0 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c  sert( !pPgOld ||
310c0 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31   pPgOld->nRef==1
310d0 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64   );.  if( pPgOld
310e0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61   ){.    pPg->fla
310f0 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66  gs |= (pPgOld->f
31100 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
31110 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20 4d  SYNC);.    if( M
31120 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
31130 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64 20   Do not discard 
31140 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e  pages from an in
31150 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
31160 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74 0a   since we might.
31170 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
31180 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e   rollback later.
31190 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20    Just move the 
311a0 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20  page out of the 
311b0 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  way. */.      as
311c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
311d0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
311e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
311f0 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50 61  Move(pPgOld, pPa
31200 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a  ger->dbSize+1);.
31210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31220 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
31230 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  op(pPgOld);.    
31240 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e  }.  }..  origPgn
31250 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
31260 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
31270 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  ve(pPg, pgno);. 
31280 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
31290 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
312a0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
312b0 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  ed = 1;..  if( n
312c0 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
312d0 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
312e0 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
312f0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
31300 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
31310 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
31320 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
31330 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
31340 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
31350 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
31360 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
31370 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
31380 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
31390 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
313a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73   the .    ** "is
313b0 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76   journaled" bitv
313c0 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e  ec flag has been
313d0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
313e0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
313f0 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e  by.    ** loadin
31400 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
31410 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
31420 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
31430 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a  PgHdr.needSync .
31440 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20      ** flag..   
31450 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
31460 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  e attempt to loa
31470 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  d the page into 
31480 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66  the page-cache f
31490 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a  ails, (due.    *
314a0 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20  * to a malloc() 
314b0 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20  or IO failure), 
314c0 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e  clear the bit in
314d0 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b   the pInJournal[
314e0 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20  ].    ** array. 
314f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
31500 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  e page is loaded
31510 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61   and written aga
31520 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69  in in.    ** thi
31530 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
31540 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
31550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31560 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20   file before.   
31570 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64   ** it is synced
31580 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
31590 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79  l file. This way
315a0 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20  , it may end up 
315b0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
315c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65  urnal file twice
315d0 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f  , but that is no
315e0 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20  t a problem..   
315f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
31600 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
31610 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
31620 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
31630 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
31640 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
31650 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
31660 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
31670 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
31680 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
31690 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
316a0 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
316b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
316c0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
316d0 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
316e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
316f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
31700 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  f( needSyncPgno<
31710 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
31720 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ize ){.        a
31730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
31740 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20  TmpSpace!=0 );. 
31750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
31760 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
31770 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
31780 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67  edSyncPgno, pPag
31790 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
317a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
317b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
317c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
317d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  ync = 1;.    ass
317e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ert( pPager->noS
317f0 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  ync==0 && !MEMDB
31800 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   );.    pPgHdr->
31810 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
31820 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71  EED_SYNC;.    sq
31830 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
31840 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
31850 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31860 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
31870 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  /*.  ** For 
31880 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
31890 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  abase, make sure
318a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
318b0 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a  ge continues.  *
318c0 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63  * to exist, in c
318d0 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
318e0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c  ion needs to rol
318f0 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50 67  l back.  Use pPg
31900 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65 20  Old.  ** as the 
31910 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69  original page si
31920 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72 65 61  nce it has alrea
31930 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
31940 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  d..  */.  if( ME
31950 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MDB ){.    sqlit
31960 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
31970 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a  Old, origPgno);.
31980 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
31990 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20  Unref(pPgOld);. 
319a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
319b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
319c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
319d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
319e0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
319f0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
31a00 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
31a10 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
31a20 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
31a30 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
31a40 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
31a50 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
31a60 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
31a70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
31a80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
31a90 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
31aa0 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
31ab0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
31ac0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
31ad0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
31ae0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
31af0 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
31b00 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
31b10 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a  rn pPg->pExtra;.
31b20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
31b30 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
31b40 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
31b50 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
31b60 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
31b70 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
31b80 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
31b90 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
31ba0 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
31bb0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31bc0 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
31bd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31be0 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
31bf0 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
31c00 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
31c10 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
31c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
31c30 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
31c40 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
31c50 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
31c60 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
31c70 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
31c80 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
31c90 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
31ca0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
31cb0 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
31cc0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
31cd0 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
31ce0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
31cf0 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
31d00 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
31d10 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
31d20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31d30 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
31d40 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
31d50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
31d60 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
31d70 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
31d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
31d90 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
31da0 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
31db0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
31dc0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
31dd0 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
31de0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
31df0 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
31e00 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
31e10 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
31e20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31e30 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  eMode = (u8)eMod
31e40 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
31e50 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
31e60 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
31e70 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
31e80 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
31e90 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
31ea0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
31eb0 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
31ec0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31ed0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a  RNALMODE_QUERY.*
31ee0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31ef0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
31f00 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
31f10 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
31f20 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31f30 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
31f40 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31f50 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20  ALMODE_OFF.**   
31f60 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31f70 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20  DE_MEMORY.**.** 
31f80 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
31f90 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
31fa0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
31fb0 5f 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  _mode is set to 
31fc0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65  the.** value spe
31fd0 63 69 66 69 65 64 20 69 66 20 74 68 65 20 63 68  cified if the ch
31fe0 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e  ange is allowed.
31ff0 20 20 54 68 65 20 63 68 61 6e 67 65 20 69 73 20    The change is 
32000 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f  disallowed.** fo
32010 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
32020 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  reasons:.**.**  
32030 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79   *  An in-memory
32040 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e   database can on
32050 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72  ly have its jour
32060 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20  nal_mode set to 
32070 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20  _OFF.**      or 
32080 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20  _MEMORY..**.**  
32090 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   *  The journal 
320a0 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  mode may not be 
320b0 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20  changed while a 
320c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
320d0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ctive..**.** The
320e0 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61   returned indica
320f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  te the current (
32100 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
32110 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  ) journal-mode..
32120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32130 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  gerJournalMode(P
32140 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
32150 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
32160 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
32170 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
32180 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
32190 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
321a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
321b0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
321c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
321d0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
321e0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
321f0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32200 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
32210 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
32220 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32230 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
32240 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32250 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32260 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
32270 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
32280 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
32290 45 52 59 3c 30 20 29 3b 0a 20 20 69 66 28 20 65  ERY<0 );.  if( e
322a0 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 21  Mode>=0.   && (!
322b0 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d  MEMDB || eMode==
322c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
322d0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
322e0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
322f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32300 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21  ODE_OFF).   && !
32310 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32320 65 64 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65  ed.   && (!isOpe
32330 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
32340 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  | 0==pPager->jou
32350 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20  rnalOff).  ){.  
32360 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
32370 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32380 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
32390 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
323a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
323b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
323c0 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
323d0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
323e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
323f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
32400 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
32410 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
32420 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
32430 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69  les..**.** Setti
32440 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69  ng the size limi
32450 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  t to -1 means no
32460 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63   limit is enforc
32470 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70  ed..** An attemp
32480 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74  t to set a limit
32490 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31   smaller than -1
324a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
324b0 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72  i64 sqlite3Pager
324c0 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
324d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
324e0 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69  i64 iLimit){.  i
324f0 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b  f( iLimit>=-1 ){
32500 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
32510 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
32520 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  iLimit;.  }.  re
32530 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  turn pPager->jou
32540 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d  rnalSizeLimit;.}
32550 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
32560 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32570 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
32580 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61  variable. The ba
32590 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  ckup module.** i
325a0 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74  n backup.c maint
325b0 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ains the content
325c0 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c   of this variabl
325d0 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  e. This module.*
325e0 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65  * uses it opaque
325f0 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ly as an argumen
32600 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b  t to sqlite3Back
32610 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a  upRestart() and.
32620 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  ** sqlite3Backup
32630 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a  Update() only..*
32640 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  /.sqlite3_backup
32650 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42   **sqlite3PagerB
32660 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a  ackupPtr(Pager *
32670 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
32680 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  n &pPager->pBack
32690 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  up;.}..#endif /*
326a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
326b0 4b 49 4f 20 2a 2f 0a                             KIO */.