/ Hex Artifact Content
Login

Artifact f7d645a831cbca683bbf9f7d55ca7bd191223ce0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
0370: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
0380: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
0390: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03a0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03b0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
03c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
03d0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
03e0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
03f0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0410: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0420: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0430: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0440: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0450: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
0460: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
0470: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0480: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
0490: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04a0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04b0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
04c0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
04d0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
04e0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
04f0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0500: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0510: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0520: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0530: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0540: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0550: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
0560: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
0570: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
0580: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
0590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05a0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05b0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
05c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
05d0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
05e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
05f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0600: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0620: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0630: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0640: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0650: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0660: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0680: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
06c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
06d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
06e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
06f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0710: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0720: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0730: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0740: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0750: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0780: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0790: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
07c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
07d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0800: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0810: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0820: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0830: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0840: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0850: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0880: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0890: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08a0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
08d0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
08e0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
08f0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0920: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0930: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0960: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0970: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0980: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0990: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09a0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
09c0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
09d0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
09e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0a60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0a70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0a90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0aa0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0ab0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0ac0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0ad0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ae0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0af0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0b70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0ba0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bb0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0bc0: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0bf0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c30: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c40: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c50: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0c60: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0c70: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0c80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0c90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ca0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cb0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0cc0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0cd0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0ce0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0cf0: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d00: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d10: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d20: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d30: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d40: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d50: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0d60: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d90: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0da0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0db0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0dc0: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0dd0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0de0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0df0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e00: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e10: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e40: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e50: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0e60: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0e70: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0e80: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0e90: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ea0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0eb0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0ec0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0ed0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0ee0: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0ef0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f00: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f10: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f30: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f40: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f50: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0f60: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0f70: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0f80: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0f90: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fa0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0fb0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
0fc0: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
0fd0: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
0fe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0ff0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1000: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1010: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1020: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1030: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1050: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
1060: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1080: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
1090: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10a0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10b0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
10c0: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41        5../*.** A
10d0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
10e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
10f0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1100: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1110: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1120: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1130: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
1140: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
1150: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1160: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
1170: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
1180: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
1190: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
11a0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
11b0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
11c0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
11e0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
11f0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
1200: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
1210: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
1220: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
1230: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
1240: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
1250: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
1260: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
1270: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
1280: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
1290: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
12a0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
12b0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
12c0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
12d0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
12e0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
12f0: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
1300: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
1310: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
1320: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
1330: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
1340: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
1350: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
1360: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
1370: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
1380: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
1390: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
27f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
2800: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
2810: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
2820: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
2830: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
2840: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
2850: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2860: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2870: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
2880: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
2890: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
28a0: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
28b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
28c0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
28d0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
2900: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
2910: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2920: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2930: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2940: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2950: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2960: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2970: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2980: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2990: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
29a0: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
29b0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29e0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29f0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2a00: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2a10: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a20: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a30: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a40: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a60: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a70: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a80: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2ab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ac0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ad0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ae0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2af0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2b00: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2b10: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b20: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b30: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b60: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b80: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b90: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2ba0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bd0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bf0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2c00: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2c10: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c20: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c30: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c40: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c50: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c60: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c70: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c80: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c90: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2ca0: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2cb0: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2cc0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2ce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cf0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2d00: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2d10: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d20: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d30: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d40: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d50: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d60: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d70: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d80: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d90: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2da0: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2db0: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2dc0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2dd0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2de0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2df0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2e00: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2e10: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e20: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e40: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e50: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e60: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e70: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2ea0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2eb0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ee0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ef0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2f00: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2f10: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f30: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f40: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f50: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f70: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f80: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2fa0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fe0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2ff0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3010: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3020: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3030: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3040: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3060: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3070: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
3080: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
3090: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30a0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
30b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
30c0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
3110: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
3120: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
3130: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
3140: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3150: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3170: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3190: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
31a0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
31b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
31c0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
31d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
31e0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
3200: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
3210: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
3220: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
3230: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3250: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3260: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3270: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
3280: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
32b0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
32c0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
32d0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
32e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
32f0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3310: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
3320: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
3330: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3340: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
3350: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
3360: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
3370: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
3380: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
3390: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
33b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
33e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3400: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
3410: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3420: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3430: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3450: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
3460: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
3470: 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53  ader */.  PagerS
3480: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
3490: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
34a0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
34b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
34c0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
34d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
34f0: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
3500: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
3510: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
3520: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
3530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3540: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73  anges */.  u32 s
3550: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3560: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3570: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3580: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3590: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
35c0: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
35d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
35e0: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
3610: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
3620: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
3630: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3650: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
3660: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
3670: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
36a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
36b0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
36e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
36f0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
3700: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
3710: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
3730: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
3740: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3770: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
3780: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
3790: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
37a0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
37b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
37c0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
37d0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
37e0: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
37f0: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
3800: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3810: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
3830: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
3840: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
3850: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
3860: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3870: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
3880: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3890: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
38a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
38b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
38c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
38d0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
38e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
38f0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
3900: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3910: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3920: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3930: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3940: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
3950: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
3960: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
3970: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
3980: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
3990: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
39a0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
39b0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
39c0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
39d0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
3a00: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
3a10: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
3a20: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
3a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a40: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
3a50: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
3a60: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69  r tmp use */.  i
3a70: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
3a80: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
3a90: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
3aa0: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
3ab0: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68  files */.  PCach
3ac0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
3ad0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ae0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
3af0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
3b00: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
3b10: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
3b20: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
3b30: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
3b40: 63 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  cesses */.};../*
3b50: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3b60: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
3b70: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
3b80: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
3b90: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
3ba0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
3bb0: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
3bc0: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
3bd0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
3be0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
3bf0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
3c00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3c10: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
3c20: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
3c30: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
3c50: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
3c60: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
3c70: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
3c80: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
3c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3ca0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
3cb0: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
3cc0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
3cd0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3cf0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
3d00: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
3d10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
3d20: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
3d30: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
3d40: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
3d50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3d60: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3d70: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3d80: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3d90: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3da0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3db0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3dc0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
3dd0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
3de0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
3df0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3e00: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
3e10: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
3e20: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3e30: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3e40: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3e50: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3e60: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
3e70: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3e80: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3e90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3ea0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3eb0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3ec0: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
3ed0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
3ee0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
3ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
3f00: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
3f10: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
3f20: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3f30: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3f40: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3f50: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3f60: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3f70: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3f80: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3fa0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3fb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3fc0: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
3fd0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
3fe0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
3ff0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
4000: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
4010: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
4020: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
4030: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
4040: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
4050: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
4060: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
4070: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
4080: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
4090: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
40a0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
40b0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
40c0: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
40d0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
40e0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
40f0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
4100: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
4110: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
4120: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
4130: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
4140: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
4150: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
4160: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
4170: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
4180: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
4190: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
41a0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
41b0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
41c0: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
41d0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
41e0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
41f0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
4200: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
4210: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
4220: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
4230: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
4240: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
4250: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
4260: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4270: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
4280: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
4290: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
42a0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
42b0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
42c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
42d0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
42e0: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
42f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4300: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
4310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
4320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4330: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4340: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4350: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4360: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4370: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
4380: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
43a0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
43b0: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
43c0: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
43d0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
43e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
43f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4400: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4410: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4420: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
4430: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
4440: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
4450: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
4460: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
4470: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
4480: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4490: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
44a0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
44b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
44c0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
44d0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
44e0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
44f0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4500: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4510: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
4530: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
4540: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
4550: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
4560: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
4570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4580: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
4590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45a0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
45b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
45c0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
45d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
45e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
45f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
4600: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
4610: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a  e(pPager) );.*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
4630: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
4640: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
4650: 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20   /* A temp-file 
4660: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47  is always in PAG
4670: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20  ER_EXCLUSIVE or 
4680: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
4690: 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
46a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
46b0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
46c0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
46d0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
46e0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
46f0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
4700: 79 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d  ys set for temp-
4710: 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
4720: 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
4730: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
4740: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
4750: 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  e );..  return 1
4760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4780: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
4790: 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a   to write page *
47a0: 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62  pPg into the sub
47b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70  -journal..** A p
47c0: 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
47d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
47e0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
47f0: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
4800: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e  .** or more open
4810: 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20   savepoints for 
4820: 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  which:.**.**   *
4830: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4840: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
4850: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
4860: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20  avepoint.nOrig, 
4870: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62  and.**   * The b
4880: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
4890: 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d   to the page-num
48a0: 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69  ber is not set i
48b0: 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61  n.**     PagerSa
48c0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
48d0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
48e0: 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73  int subjRequires
48f0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4900: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  {.  Pgno pgno = 
4910: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  pPg->pgno;.  Pag
4920: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4930: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
4940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4950: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
4960: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61  nt; i++){.    Pa
4970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
4980: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
4990: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
49a0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
49b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
49c0: 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53  tvecTest(p->pInS
49d0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
49e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
49f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
4a00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4a20: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
4a30: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
4a40: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
4a50: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
4a60: 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
4a70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
4a80: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
4a90: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  g->pPager->pInJo
4aa0: 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
4ab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
4ac0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4ad0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4ae0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4af0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4b00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4b10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4b20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4b30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4b40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4b50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4b60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4b80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4b90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4ba0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4bb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4bc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
4bd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
4be0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
4bf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
4c00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
4c10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
4c20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
4c30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
4c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4c50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
4c60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
4c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4c90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4ca0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
4cb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
4cc0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
4cd0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
4ce0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
4cf0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
4d00: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
4d10: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4d20: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
4d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4d40: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d50: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
4d60: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4d70: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4d80: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4d90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4da0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
4db0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
4dc0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
4dd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
4de0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4e00: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4e10: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
4e20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
4e30: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
4e40: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
4e50: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
4e60: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
4e70: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
4e80: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
4e90: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
4ea0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
4eb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
4ec0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
4ed0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
4ee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
4ef0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
4f00: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
4f10: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
4f20: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
4f30: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
4f40: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
4f50: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
4f60: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
4f70: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
4f80: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
4f90: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
4fa0: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
4fb0: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
4fc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
4fd0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
4fe0: 66 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20  f( !isOpen(pFd) 
4ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5000: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
5010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
5020: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
5030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5040: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
5050: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
5060: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
5070: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
5080: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
5090: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
50a0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
50b0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
50c0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
50d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
50e0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
50f0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
5100: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
5110: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
5120: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
5130: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
5140: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
5150: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5160: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
5170: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
5180: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
5190: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
51a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
51b0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
51c0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
51d0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
51e0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
51f0: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
5200: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
5210: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
5220: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
5230: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
5240: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
5250: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
5260: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
5270: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
5280: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
5290: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
52a0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
52b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
52c0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
52d0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
52e0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
52f0: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
5300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5310: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
5320: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
5330: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
5340: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
5350: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
5360: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
5370: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
5380: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
53b0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
53c0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
53f0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
5400: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
5410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
5420: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
5430: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
5440: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
5450: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
5460: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5470: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
5480: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
5490: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
54a0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
54b0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
54c0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
54d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
54e0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
54f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
5500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5510: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
5520: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
5530: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
5540: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
5550: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
5560: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
5570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5580: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
5590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
55a0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
55b0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
55c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
55d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
55e0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
55f0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
5600: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
5610: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
5620: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
5630: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
5640: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5650: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
5660: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
5670: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5680: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
5690: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
56a0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
56b0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
56c0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
56d0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
56e0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
56f0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
5700: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5710: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5720: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
5730: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
5740: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
5750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5760: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
5770: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5780: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5790: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
57a0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
57b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
57c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
57d0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
57e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
57f0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
5800: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
5810: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
5820: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
5830: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
5840: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
5850: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
5860: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
5870: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
5880: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
5890: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
58a0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
58b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
58c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
58d0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
58e0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
58f0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
5900: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
5910: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
5920: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
5930: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
5940: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
5950: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
5960: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5970: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5980: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
5990: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
59a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
59b0: 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  ode.      || (pP
59c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
59d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
59e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
59f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
5a00: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
5a10: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
5a20: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
5a40: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
5a50: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
5a60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
5a70: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
5a80: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
5a90: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
5aa0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
5ab0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
5ac0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
5ad0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
5ae0: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
5af0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5b00: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
5b10: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
5b20: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
5b30: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
5b40: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
5b50: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
5b60: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
5b70: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
5b80: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5b90: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
5ba0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
5bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5bc0: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
5bd0: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5be0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
5bf0: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
5c00: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
5c10: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
5c20: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5c30: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
5c40: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
5c50: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
5c60: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
5c70: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
5c80: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5c90: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
5ca0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
5cb0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
5cc0: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
5cd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5ce0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
5cf0: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
5d00: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
5d20: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
5d30: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
5d40: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
5d50: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
5d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
5d70: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
5d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5d90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
5da0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5db0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
5dc0: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
5dd0: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
5de0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
5df0: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
5e00: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
5e10: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
5e20: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
5e30: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
5e40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5e50: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
5e60: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
5e70: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
5e80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5e90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
5ea0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
5eb0: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
5ec0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5ee0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
5ef0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
5f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
5f10: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
5f20: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5f30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5f40: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5f50: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
5f60: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
5f70: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
5f80: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
5fb0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
5fe0: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
5ff0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
6000: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
6010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
6020: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
6030: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
6040: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
6050: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
6070: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
6080: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
6090: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
60c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
60d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
60e0: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
60f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6100: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6110: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
6120: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
6130: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6140: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6150: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
6160: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
6170: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6180: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
6190: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
61a0: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
61b0: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
61c0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
61d0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
61e0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
61f0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6200: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
6210: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
6220: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
6230: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
6240: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6250: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
6260: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6270: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6280: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
6290: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
62a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
62b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
62c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
62d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
62e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
62f0: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
6300: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
6310: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
6320: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
6330: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
6340: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
6350: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
6360: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
6370: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
6380: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
6390: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
63a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
63b0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
63c0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
63d0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
63e0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
63f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
6400: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
6410: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
6420: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
6430: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
6440: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
6450: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
6460: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
6470: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6490: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
64a0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
64b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
64c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
64d0: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
64e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
64f0: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
6500: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
6510: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
6520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
6530: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
6540: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
6550: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6560: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
6570: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
6610: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
6620: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
6630: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
6640: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
6650: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
6660: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
6670: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
6680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6690: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
66a0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
66b0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
66c0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
66d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66e0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
66f0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6700: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6710: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6720: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6730: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6740: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6750: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
6760: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
6770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6780: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6790: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
67a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
67b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
67c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
67d0: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
67e0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
67f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
6800: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
6810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
6820: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
6830: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
6840: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
6850: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
6860: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
6870: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
6880: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
6890: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
68a0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
68b0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
68c0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
68d0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
68e0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
68f0: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
6900: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
6910: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
6920: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
6930: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
6940: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
6950: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6960: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
6970: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
6980: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
6990: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
69a0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
69b0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
69c0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
69d0: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
69e0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
69f0: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
6a00: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
6a10: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
6a20: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
6a30: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
6a40: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6a50: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
6a60: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6a80: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
6a90: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
6aa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
6ab0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
6ac0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
6ad0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6ae0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
6af0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
6b00: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
6b10: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
6b20: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
6b30: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
6b40: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
6b50: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
6b60: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
6b70: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6b80: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
6b90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6bd0: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
6be0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
6bf0: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
6c00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6c10: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
6c20: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
6c30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
6c40: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
6c50: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
6c60: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
6c70: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
6c80: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
6c90: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
6ca0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6cc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
6cd0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
6cf0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
6d00: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
6d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6d30: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
6d40: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
6d50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6d60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6d70: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
6d80: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
6d90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
6da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
6db0: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
6dc0: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
6dd0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
6de0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
6df0: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
6e00: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6e10: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
6e20: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
6e30: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
6e40: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
6e50: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
6e60: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
6e70: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
6e80: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
6e90: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
6ea0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
6eb0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
6ec0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
6ed0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
6ee0: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
6ef0: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
6f00: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
6f10: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
6f20: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
6f30: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
6f40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6f50: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
6f60: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
6f70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6f80: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6f90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
6fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
6fb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
6fc0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
6fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6fe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ff0: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
7000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7030: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7040: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7050: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7060: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7070: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7080: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7090: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
70a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
70b0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
70c0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
70d0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
70e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
70f0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7100: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7110: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7120: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7130: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7140: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7150: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7160: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7170: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7180: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7190: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
71a0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
71b0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
71c0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
71d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
71e0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
71f0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7200: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7210: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
7220: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
7230: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
7240: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7250: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7260: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
7270: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7280: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
7290: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
72a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
72b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
72e0: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
72f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
7300: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
7310: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
7320: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
7330: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
7340: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7350: 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ze;     /* Size 
7360: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
7370: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
7380: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
73b0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
73c0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
73d0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7400: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
7410: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
7420: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
7430: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
7440: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
7450: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
7460: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7470: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
7480: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
7490: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
74a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
74b0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
74c0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
74d0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
74e0: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
74f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7500: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
7510: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
7520: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
7530: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
7540: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
7550: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
7560: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
7570: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
7580: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
7590: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
75a0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
75b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
75c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
75d0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
75e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
7600: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
7610: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7620: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
7630: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
7640: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
7650: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
7660: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
7670: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7680: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7690: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
76a0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
76b0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
76c0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
76d0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
76e0: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
76f0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7700: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
7720: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
7730: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
7740: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
7750: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
7760: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
7770: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7780: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7790: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
77a0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
77b0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
77c0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
77d0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
77e0: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
77f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7800: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7810: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
7820: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
7830: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7840: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
7850: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
7860: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
7870: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7880: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7890: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
78a0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
78b0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
78c0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
78d0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
78e0: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
78f0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7900: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7910: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
7920: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
7930: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
7940: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
7950: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
7960: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7970: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7980: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7990: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
79a0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
79b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
79c0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
79d0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
79e0: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
79f0: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a00: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a10: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7a20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7a30: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7a40: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7a50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7a60: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7a70: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7a80: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7a90: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7aa0: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7ab0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7ac0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7ad0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7ae0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7af0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
7b00: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
7b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7b20: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7b30: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
7b40: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b60: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
7b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
7b80: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
7b90: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7ba0: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
7bb0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7bc0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7bd0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7be0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7bf0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c00: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c10: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c20: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c30: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7c40: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7c70: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7c80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7cb0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7cc0: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7cd0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7ce0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7cf0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d20: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d30: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7d40: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7d50: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7d60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7d70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7d80: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7d90: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7da0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7db0: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7dc0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7dd0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7de0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7df0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e00: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e10: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e20: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e30: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7e40: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7e50: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7e60: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7e70: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7e80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7e90: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7ea0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7eb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ec0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7ed0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ef0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f00: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f10: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f20: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f30: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7f40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7f50: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7f60: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7f70: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7f80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7f90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
7fa0: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
7fb0: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
7fc0: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
7fd0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
7fe0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
7ff0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8000: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8010: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8020: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8030: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
8040: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
8050: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
8060: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
8070: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
8080: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
8090: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
80a0: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
80b0: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
80c0: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
80d0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
80e0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
80f0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8100: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8110: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8120: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
8140: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
8150: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
8160: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
8170: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
8180: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
8190: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
81a0: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
81b0: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
81c0: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
81d0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
81e0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
81f0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8200: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8210: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8220: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8230: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8240: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
8250: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
8260: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
8270: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
8280: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
8290: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
82a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
82b0: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
82c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
82d0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
82e0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
82f0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8300: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8320: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8340: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8350: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
8360: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
8370: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
8380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8390: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
83a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
83b0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
83c0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
83d0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
83e0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
83f0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8400: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8410: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8420: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8430: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
8440: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8450: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
8460: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8470: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
8480: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
8490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
84a0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
84b0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
84c0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
84d0: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
84e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
84f0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8510: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8520: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
8540: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
8550: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
8560: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
8570: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
8580: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
8590: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
85a0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
85b0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
85c0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
85d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
85e0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
85f0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8600: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8610: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8620: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8630: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
8640: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
8650: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
8660: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
8670: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
8680: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
8690: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
86a0: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
86b0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
86c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
86d0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
86e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
86f0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8700: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8710: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8720: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8730: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
8740: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
8750: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
8760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
8770: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
8780: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8790: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
87a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
87b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
87c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
87f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8800: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8810: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8820: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8830: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8840: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8850: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8860: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8880: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8890: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
88a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
88b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
88c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
88d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8910: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8920: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8930: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8940: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8950: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8960: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8970: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8980: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8990: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
89a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
89b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
89c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
89d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
89e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
89f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a00: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a10: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a30: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8a40: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8a50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8a60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8a70: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8a80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8aa0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8ab0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8ac0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8ad0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8ae0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8af0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8b40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8b50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8b70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8b80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8b90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8ba0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8bb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8bc0: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8bd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8bf0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c00: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c10: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c20: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8c40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8c50: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8c60: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8c80: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8cb0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8cc0: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8cd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8cf0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d00: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d10: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d30: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8d40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8d50: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8d60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8d70: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8d80: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8d90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8da0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8db0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8dc0: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8dd0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8de0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e00: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e10: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e30: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e50: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8e60: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8e70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8e90: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8ea0: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8ec0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8ed0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ee0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8ef0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f00: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f10: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f20: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f30: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8f40: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8f50: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8f60: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8f70: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8f80: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8f90: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8fa0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8fb0: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8fc0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8fd0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8fe0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8ff0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9000: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9010: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9040: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
9050: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
9060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
9080: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
9090: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
90a0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
90b0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
90c0: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
90d0: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
90e0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
90f0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9100: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9110: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9120: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9130: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
9140: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
9150: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
9160: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
9170: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
9180: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
9190: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
91a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
91b0: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
91c0: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
91d0: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
91e0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
91f0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
9200: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
9210: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
9220: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
9230: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
9240: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
9250: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
9260: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9270: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
9280: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
9290: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
92a0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
92b0: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
92c0: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
92d0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
92e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
92f0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
9300: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
9310: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
9320: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
9330: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
9340: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
9350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
9360: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
9370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9380: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
9390: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
93a0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
93b0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
93c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
93d0: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
93e0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
93f0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
9400: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
9410: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
9420: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
9430: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
9440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
9450: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
9460: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
9470: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
9480: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
9490: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
94a0: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
94b0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
94c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
94d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
94e0: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
94f0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
9500: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
9510: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
9520: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
9530: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
9540: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
9550: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
9560: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
9570: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
9580: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
9590: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
95a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
95b0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
95c0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
95d0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
95e0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
95f0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
9600: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
9610: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
9620: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
9630: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
9640: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
9650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
9660: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
9670: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
9680: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
9690: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
96a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
96b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
96c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
96d0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
96e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
96f0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9700: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
9710: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
9720: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
9730: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
9750: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
9760: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
9770: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9780: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9790: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
97a0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
97b0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
97c0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
97d0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
97e0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
97f0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
9800: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
9810: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
9820: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
9830: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
9840: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
9850: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
9860: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
9870: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
9880: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
9890: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
98a0: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
98b0: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
98c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
98d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
98e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
98f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
9900: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
9910: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9920: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
9930: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
9940: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
9950: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
9960: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
9970: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
9980: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
9990: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
99a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
99b0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
99c0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
99d0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
99e0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
99f0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
9a00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9a10: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
9a20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
9a30: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
9a40: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9a50: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a80: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
9a90: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9ab0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
9ac0: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
9ad0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9af0: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
9b00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
9b10: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
9b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9b30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
9b50: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
9b60: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9b80: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
9b90: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
9ba0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
9bb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9bc0: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9bf0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
9c00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9c10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9c20: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
9c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c40: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
9c50: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
9c70: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9c80: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
9c90: 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
9ca0: 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
9cb0: 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
9cc0: 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
9cd0: 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
9ce0: 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
9cf0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
9d00: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d10: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
9d20: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9d30: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
9d40: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
9d50: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
9d60: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
9d70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
9d80: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
9d90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
9da0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
9db0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
9dc0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
9dd0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
9de0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
9df0: 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
9e00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
9e10: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
9e20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
9e30: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
9e50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
9e60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
9e70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
9e90: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
9ea0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9eb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9ec0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
9ed0: 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
9ee0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
9ef0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9f00: 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
9f10: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
9f20: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9f30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
9f50: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
9f60: 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
9f70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9f80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9f90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9fa0: 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
9fb0: 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
9fc0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9fd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9fe0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9ff0: 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
a000: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
a010: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
a030: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
a040: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
a050: 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
a060: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a080: 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
a090: 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  20);.  pPager->n
a0a0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
a0b0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
a0c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a0d0: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
a0e0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
a0f0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
a100: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
a110: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
a120: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a130: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a140: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
a150: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
a160: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
a170: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
a180: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
a190: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
a1a0: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
a1b0: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
a1c0: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
a1d0: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
a1e0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
a1f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
a200: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
a210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
a220: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
a230: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
a240: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
a250: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
a260: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
a280: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
a290: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
a2a0: 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
a2b0: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
a2c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
a2d0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
a2e0: 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
a2f0: 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
a300: 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a320: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
a330: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
a340: 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
a350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a360: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
a370: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
a380: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
a390: 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
a3a0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
a3b0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
a3c0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
a3d0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
a3e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
a3f0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
a400: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
a410: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
a420: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
a430: 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
a460: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
a470: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a480: 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
a490: 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
a4a0: 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
a4b0: 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
a4c0: 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
a4d0: 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
a4e0: 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
a4f0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
a500: 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
a510: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
a520: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
a530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
a540: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74  ../*.** Unless t
a550: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a560: 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63  rror-state, disc
a570: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
a580: 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74  y pages. If.** t
a590: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a5a0: 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e  rror-state, then
a5b0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
a5c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  no-op..**.** TOD
a5d0: 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f  O: Why can we no
a5e0: 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  t reset the page
a5f0: 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72  r while in error
a600: 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69   state?.*/.stati
a610: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
a620: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
a630: 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ){.  if( SQLITE_
a640: 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43  OK==pPager->errC
a650: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
a660: 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
a670: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
a680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
a690: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
a6a0: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70  >pPCache);.    p
a6b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
a6c0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
a6d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
a6e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
a6f0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a700: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
a710: 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
a720: 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
a730: 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
a740: 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
a750: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
a760: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
a770: 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
a780: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
a790: 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
a7a0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
a7b0: 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
a7c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
a7d0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
a7e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
a7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
a800: 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
a810: 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
a820: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
a830: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
a850: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
a860: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
a870: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
a880: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
a890: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
a8a0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
a8b0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
a8c0: 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
a8d0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a8e0: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a900: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a910: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a920: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a930: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a940: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a950: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a960: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a970: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a980: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a990: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a9a0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a9b0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a9c0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a9d0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a9e0: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a9f0: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
aa00: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
aa10: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
aa20: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
aa30: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
aa40: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
aa50: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
aa80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
aa90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
aaa0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
aab0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
aac0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
aad0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
aae0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aaf0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
ab00: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
ab10: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
ab20: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
ab30: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
ab40: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
ab50: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
ab60: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
ab70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
ab80: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
ab90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
aba0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
abc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
abd0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
abe0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
abf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
ac00: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
ac10: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
ac20: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
ac30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
ac40: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
ac50: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
ac60: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
ac70: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
ac80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
ac90: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
aca0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
acb0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
acc0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
acd0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
ace0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
acf0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ad00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ad10: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ad20: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ad30: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ad40: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
ad50: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
ad60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
ad70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
ad80: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
ad90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
ada0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
adb0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
adc0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
add0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ade0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
adf0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ae00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ae10: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ae20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ae30: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ae40: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ae50: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
ae70: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
ae80: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
ae90: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
aea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
aeb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
aec0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
aed0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
aee0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
aef0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
af10: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
af20: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
af30: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
af40: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
af50: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
af60: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
af70: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
af80: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
af90: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
afa0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
afb0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
afc0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
afd0: 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74   TODO: Really, t
afe0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
aff0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
b000: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
b010: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
b020: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
b030: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
b040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
b050: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
b060: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = 0;..    rc = o
b070: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b080: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
b090: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
b0a0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b0b0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
b0c0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
b0d0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
b0e0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
b0f0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
b100: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
b110: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
b120: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
b130: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
b140: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
b150: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
b160: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
b170: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
b180: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
b190: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
b1a0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
b1b0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
b1c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
b1d0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
b1e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b1f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
b200: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
b210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b220: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
b230: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
b240: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
b250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
b260: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
b270: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
b280: 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NLOCK;.  }.}../*
b290: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b2a0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
b2b0: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
b2c0: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
b2d0: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
b2e0: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68  ave occurred. Th
b2f0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b300: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
b310: 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73   the pager .** s
b320: 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
b330: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
b340: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
b350: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
b360: 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63  ger .** API func
b370: 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
b380: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
b390: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
b3a0: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
b3b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
b3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
b3d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
b3e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
b3f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
b400: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
b410: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
b420: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
b430: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
b440: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
b450: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
b460: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
b470: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
b480: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
b490: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
b4a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
b4b0: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
b4c0: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
b4d0: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
b4e0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
b4f0: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
b500: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
b510: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
b520: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
b530: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
b540: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
b550: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
b560: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
b570: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
b580: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
b590: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
b5a0: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
b5b0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
b5c0: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
b5d0: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
b5e0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
b5f0: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
b600: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
b610: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
b620: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
b630: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
b640: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
b650: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
b660: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
b670: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
b680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
b690: 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
b6a0: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
b6b0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b6c0: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
b6d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
b6e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
b6f0: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
b700: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
b710: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
b720: 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
b730: 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
b740: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
b750: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b760: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
b770: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b780: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
b790: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
b7a0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
b7b0: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
b7c0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
b7d0: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
b7e0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
b7f0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
b800: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
b810: 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
b820: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
b830: 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
b840: 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
b850: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
b860: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
b870: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
b880: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
b890: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
b8a0: 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
b8b0: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
b8c0: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
b8d0: 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
b8e0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
b8f0: 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
b900: 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
b910: 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
b920: 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
b930: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
b940: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
b950: 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
b960: 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
b970: 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
b980: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
b990: 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
b9a0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
b9b0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
b9c0: 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
b9d0: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
b9e0: 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
b9f0: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
ba00: 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
ba10: 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
ba20: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
ba30: 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
ba40: 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
ba50: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
ba60: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
ba70: 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
ba80: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
ba90: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
baa0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
bab0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
bac0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
bad0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode==SQLITE_OK &
bae0: 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
baf0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
bb00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
bb10: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
bb20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
bb30: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
bb40: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
bb50: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
bb60: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
bb70: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
bb80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
bb90: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
bba0: 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
bbb0: 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
bbc0: 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
bbd0: 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
bbe0: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
bbf0: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
bc00: 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
bc10: 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
bc20: 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
bc30: 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
bc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
bc50: 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
bc60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bc70: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
bc80: 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
bc90: 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
bca0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
bcb0: 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  ction..** .** If
bcc0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
bcd0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72   PAGER_SHARED or
bce0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
bcf0: 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
bd00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bd10: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
bd20: 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54  p (returns SQLIT
bd30: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  E_OK)..**.** Oth
bd40: 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
bd50: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
bd60: 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
bd70: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
bd80: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
bd90: 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
bda0: 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
bdb0: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
bdc0: 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
bdd0: 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
bde0: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
bdf0: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
be00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
be10: 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
be20: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
be30: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
be40: 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
be50: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
be60: 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
be70: 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
be80: 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
be90: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
bea0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
beb0: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
bec0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
bed0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
bee0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
bef0: 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
bf00: 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
bf10: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bf20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
bf30: 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
bf40: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
bf50: 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
bf60: 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
bf70: 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
bf80: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
bf90: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
bfa0: 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
bfb0: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
bfc0: 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
bfd0: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
bfe0: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
bff0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
c000: 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
c010: 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
c020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c030: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
c040: 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
c050: 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
c060: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
c070: 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
c080: 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
c090: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
c0a0: 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
c0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
c0c0: 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
c0d0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
c0e0: 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
c0f0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
c100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
c110: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
c120: 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
c130: 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
c140: 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
c150: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
c160: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
c170: 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
c180: 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
c190: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
c1a0: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
c1b0: 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
c1c0: 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
c1d0: 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
c1e0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
c1f0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c200: 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
c210: 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
c220: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
c230: 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
c240: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
c250: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
c260: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20  s finalized, if 
c270: 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
c280: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c290: 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65  he.** pager move
c2a0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
c2b0: 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77  D state (and dow
c2c0: 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b  ngrades the lock
c2d0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
c2e0: 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69  ase file accordi
c2f0: 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ngly)..**.** If 
c300: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
c310: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
c320: 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e  e mode and is in
c330: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74   PAGER_SYNCED st
c340: 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73  ate,.** it moves
c350: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
c360: 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72  IVE. No locks ar
c370: 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65  e downgraded whe
c380: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20  n running in.** 
c390: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
c3a0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
c3b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
c3c0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
c3d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c3e0: 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
c3f0: 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
c400: 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
c410: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
c420: 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
c430: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
c440: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
c450: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
c460: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
c470: 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
c480: 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
c490: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c4a0: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
c4b0: 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
c4c0: 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
c4d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
c4e0: 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
c4f0: 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
c500: 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
c510: 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
c520: 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
c530: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
c540: 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
c550: 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
c560: 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
c570: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
c580: 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
c590: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
c5a0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
c5b0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
c5c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
c5d0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
c5e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c5f0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
c600: 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
c610: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
c620: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
c630: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
c640: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
c650: 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
c660: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
c670: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
c680: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
c690: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
c6a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c6b0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
c6c0: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
c6d0: 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  r);..  assert( i
c6e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
c6f0: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
c700: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
c710: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
c720: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20 20  er->jfd) ){..   
c730: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
c740: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
c750: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
c760: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
c770: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
c780: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c790: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
c7a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
c7b0: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
c7c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c7d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c7e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
c7f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c800: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c810: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
c820: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
c830: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
c840: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
c880: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
c890: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
c8a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c8b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
c8c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c8d0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c8e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
c8f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c900: 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50  Mode .     || pP
c910: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c920: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c930: 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
c940: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
c950: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
c960: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
c970: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
c980: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
c990: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c9a0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
c9b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c9c0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c9e0: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
c9f0: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
ca00: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
ca10: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
ca20: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
ca30: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
ca40: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
ca50: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
ca60: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ca70: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
ca80: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
ca90: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
caa0: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
cab0: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
cac0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
cad0: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
cae0: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
caf0: 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  ournal.  */.    
cb00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cb10: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
cb20: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
cb30: 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20  _DELETE .       
cb40: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
cb50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cb60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
cb70: 4d 4f 52 59 20 0a 20 20 20 20 20 20 29 3b 0a 20  MORY .      );. 
cb80: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
cb90: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
cba0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
cbb0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
cbc0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cbd0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
cbe0: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
cbf0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
cc00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cc10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
cc20: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
cc30: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
cc40: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
cc50: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
cc60: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
cc70: 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
cc80: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
cc90: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
cca0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
ccb0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
ccc0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
ccd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
cce0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
ccf0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
cd00: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  0;.  }..  if( !p
cd10: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cd20: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
cd30: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
cd40: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
cd50: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
cd60: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
cd70: 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65  HARED;.    pPage
cd80: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
cd90: 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ne = 0;.  }else 
cda0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
cdb0: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
cdc0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
cdd0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
cde0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
cdf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
ce00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
ce10: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
ce20: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
ce30: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44  d = 0;..  /* TOD
ce40: 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d  O: Is this optim
ce50: 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65 20 64  al? Why is the d
ce60: 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74  b size invalidat
ce70: 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68  ed here .  ** wh
ce80: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
ce90: 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f  file is not unlo
cea0: 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65  cked? */.  pPage
ceb0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
cec0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
ced0: 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
cee0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
cef0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
cf00: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
cf10: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
cf20: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  alid = 0;.  }.. 
cf30: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
cf40: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
cf50: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
cf60: 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
cf70: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cf80: 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
cf90: 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
cfa0: 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
cfb0: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
cfc0: 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
cfd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
cfe0: 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
cff0: 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
d000: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
d010: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
d020: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
d030: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
d040: 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
d050: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d060: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d070: 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
d080: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
d090: 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
d0a0: 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
d0b0: 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
d0c0: 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
d0d0: 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
d0e0: 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
d0f0: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
d100: 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
d110: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
d120: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
d130: 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
d140: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
d150: 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
d160: 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
d170: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
d180: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
d190: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
d1a0: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
d1b0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
d1c0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
d1d0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
d1e0: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
d1f0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
d200: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
d210: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
d220: 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
d230: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
d240: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
d250: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
d260: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
d270: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
d280: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
d290: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
d2a0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
d2b0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
d2c0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
d2d0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
d2e0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
d2f0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
d300: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
d310: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
d320: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
d330: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
d340: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
d350: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
d360: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
d370: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
d380: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
d390: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
d3a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
d3b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d3c0: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
d3d0: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
d3e0: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
d3f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d400: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
d410: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
d420: 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
d430: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d440: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
d450: 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
d460: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
d470: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
d480: 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
d490: 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
d4a0: 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
d4b0: 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
d4c0: 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
d4d0: 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
d4e0: 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
d4f0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
d500: 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
d510: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
d520: 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a  *.** The isMainJ
d530: 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  rnl flag is true
d540: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
d550: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
d560: 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c  urnal and.** fal
d570: 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  se for the state
d580: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
d590: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d5a0: 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a   journal uses.**
d5b0: 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
d5c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d5d0: 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a  al does not..**.
d5e0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
d5f0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
d600: 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
d610: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d620: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
d630: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d640: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
d650: 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
d660: 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
d670: 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
d680: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
d690: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
d6a0: 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
d6b0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
d6c0: 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
d6d0: 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
d6e0: 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
d6f0: 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
d700: 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
d710: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
d720: 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
d730: 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
d740: 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
d750: 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
d760: 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
d770: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
d780: 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
d790: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
d7a0: 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
d7b0: 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
d7c0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
d7d0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
d7e0: 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
d7f0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
d800: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d810: 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
d820: 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
d830: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
d840: 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
d850: 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
d860: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
d870: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
d880: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d890: 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
d8a0: 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
d8b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
d8c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
d8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d8e0: 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
d8f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
d900: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d910: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
d920: 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
d930: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
d940: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
d950: 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
d960: 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
d970: 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
d980: 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
d990: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
d9a0: 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
d9b0: 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
d9c0: 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
d9d0: 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
d9e0: 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
d9f0: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
da00: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
da20: 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
da30: 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
da40: 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
da50: 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
da60: 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
da70: 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
da80: 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
da90: 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
daa0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
dab0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
dac0: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
dad0: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
dae0: 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
daf0: 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
db00: 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
db10: 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
db20: 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
db30: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
db40: 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
db50: 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
db60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
db70: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
db80: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
db90: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
dba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dbb0: 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
dbc0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
dbd0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
dbf0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
dc00: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
dc10: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e  l. */.  int isUn
dc20: 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  sync,           
dc30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
dc40: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 75 6e   reading from un
dc50: 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75 72  synced main jour
dc60: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  nal */.  i64 *pO
dc70: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
dc80: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
dc90: 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
dca0: 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  ayback */.  int 
dcb0: 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20  isSavepnt,      
dcc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
dcd0: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
dce0: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t rollback */.  
dcf0: 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20  Bitvec *pDone   
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd10: 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
dd20: 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
dd30: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
dd40: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
dd50: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
dd60: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
dd70: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
dd80: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
dd90: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
dda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ddb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
ddc0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
ddd0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
de00: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
de10: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
de20: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
de30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
de40: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
de50: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
de60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
de70: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
de80: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
de90: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
dea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
deb0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
dec0: 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
ded0: 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
dee0: 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
def0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
df00: 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
df10: 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
df20: 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
df30: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
df40: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
df50: 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
df60: 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
df70: 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
df80: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
df90: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
dfa0: 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
dfb0: 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
dfc0: 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
dfd0: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
dfe0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
dff0: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
e000: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
e010: 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
e020: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
e030: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 2f  llocated */..  /
e040: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
e050: 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
e060: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
e070: 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
e080: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
e090: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
e0a0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
e0b0: 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
e0c0: 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
e0d0: 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
e0e0: 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
e0f0: 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
e100: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e110: 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
e120: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
e130: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
e140: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
e150: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
e160: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
e170: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
e180: 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
e190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e1a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
e1b0: 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
e1c0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
e1d0: 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
e1e0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
e1f0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
e200: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
e210: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
e220: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
e230: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
e240: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
e250: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
e260: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
e270: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
e280: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
e290: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
e2a0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e2b0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
e2c0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
e2d0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
e2e0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
e2f0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
e300: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
e310: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
e320: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
e330: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
e340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
e350: 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
e360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e370: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
e380: 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
e390: 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
e3a0: 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
e3b0: 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
e3c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e3d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
e3e0: 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
e3f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e400: 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
e410: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
e420: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
e430: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
e440: 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
e450: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
e460: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
e470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e480: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
e490: 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  ..  if( pDone &&
e4a0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
e4b0: 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
e4c0: 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
e4d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e4e0: 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
e4f0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
e500: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
e510: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
e520: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
e530: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
e540: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
e550: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
e560: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
e570: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
e580: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
e590: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
e5a0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
e5b0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e5c0: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
e5d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e5e0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e5f0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
e600: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
e610: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
e620: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
e630: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
e640: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
e650: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
e660: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
e670: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
e680: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
e690: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
e6a0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
e6b0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
e6c0: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
e6d0: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
e6e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
e6f0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
e700: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
e710: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
e720: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
e730: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
e740: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
e750: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
e760: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
e770: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
e780: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
e790: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
e7a0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
e7b0: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
e7c0: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
e7d0: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
e7e0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
e7f0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
e800: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
e810: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
e820: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
e830: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e840: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
e850: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
e860: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
e870: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
e880: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
e890: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
e8a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
e8b0: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
e8c0: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
e8d0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
e8e0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
e8f0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
e900: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
e910: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
e920: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
e930: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
e940: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
e950: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
e960: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
e970: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
e980: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
e990: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
e9a0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
e9b0: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
e9c0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
e9d0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
e9e0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
e9f0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
ea00: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
ea10: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
ea20: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
ea30: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
ea40: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
ea50: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
ea60: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
ea70: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
ea80: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
ea90: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
eaa0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
eab0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
eac0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
ead0: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
eae0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
eaf0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
eb00: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
eb10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
eb20: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
eb30: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
eb40: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
eb50: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
eb60: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
eb70: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
eb80: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
eb90: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
eba0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
ebb0: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
ebc0: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
ebd0: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
ebe0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
ebf0: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
ec00: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
ec10: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
ec20: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
ec30: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
ec40: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
ec50: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
ec60: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
ec70: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
ec80: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
ec90: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
eca0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
ecb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
ecc0: 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
ecd0: 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
ece0: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
ecf0: 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
ed00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ed10: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
ed20: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
ed30: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
ed40: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
ed50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ed60: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
ed70: 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
ed80: 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
ed90: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
eda0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
edb0: 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28 70  LUSIVE).   && (p
edc0: 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
edd0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
ede0: 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20  ED_SYNC)).   && 
edf0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
ee00: 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79  d).   && !isUnsy
ee10: 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  nc.  ){.    i64 
ee20: 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
ee30: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
ee40: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
ee50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
ee60: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
ee70: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ee80: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
ee90: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
eea0: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
eeb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
eec0: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
eed0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
eee0: 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
eef0: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef00: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef10: 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
ef20: 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
ef30: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
ef40: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
ef50: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 3b 0a  , pgno, aData);.
ef60: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef70: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef80: 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 0, rc=SQLITE_N
ef90: 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMEM);.    }.  }
efa0: 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
efb0: 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
efc0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
efd0: 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
efe0: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
eff0: 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
f000: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
f010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
f020: 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
f030: 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
f040: 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
f050: 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
f060: 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
f070: 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
f080: 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
f090: 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
f0a0: 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
f0b0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
f0c0: 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
f0d0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
f0e0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
f0f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
f100: 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
f110: 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
f120: 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
f130: 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
f140: 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
f150: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
f160: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
f170: 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
f180: 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
f190: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
f1a0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
f1b0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
f1c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
f1d0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
f1e0: 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
f1f0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
f200: 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
f210: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f220: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
f230: 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
f240: 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
f250: 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
f260: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
f270: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
f280: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
f290: 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
f2a0: 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
f2b0: 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
f2c0: 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
f2d0: 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
f2e0: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
f2f0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
f300: 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
f310: 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
f320: 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
f330: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
f340: 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72  nt );.    if( (r
f350: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f360: 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
f370: 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21  pgno, &pPg, 1))!
f380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f390: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f3a0: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c     }.    pPg->fl
f3b0: 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
f3c0: 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
f3d0: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
f3e0: 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
f3f0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
f400: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
f410: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
f420: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
f430: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
f440: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
f450: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
f460: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
f470: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
f480: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
f490: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
f4a0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
f4b0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
f4c0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
f4d0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
f4e0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
f4f0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
f500: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
f510: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
f520: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
f530: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
f540: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
f550: 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
f560: 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
f570: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
f580: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f590: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
f5a0: 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
f5b0: 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
f5c0: 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74  l && (!isSavepnt
f5d0: 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50   || *pOffset<=pP
f5e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f5f0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
f600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
f610: 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20   this page were 
f620: 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72  just restored fr
f630: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20  om the main .   
f640: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
f650: 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e  le, then its con
f660: 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20  tent must be as 
f670: 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74  they were when t
f680: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  he .      ** tra
f690: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72  nsaction was fir
f6a0: 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  st opened. In th
f6b0: 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d  is case we can m
f6c0: 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20  ark the page.   
f6d0: 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20     ** as clean, 
f6e0: 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c  since there will
f6f0: 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77   be no need to w
f700: 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
f710: 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
f720: 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
f730: 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
f740: 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
f750: 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
f760: 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
f770: 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
f780: 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
f790: 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
f7a0: 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
f7b0: 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
f7c0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
f7d0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
f7e0: 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
f7f0: 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
f800: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f810: 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
f820: 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
f830: 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
f840: 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
f850: 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
f860: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
f870: 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
f880: 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
f890: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
f8a0: 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
f8b0: 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
f8c0: 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
f8d0: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f8e0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
f8f0: 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
f900: 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
f910: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
f920: 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
f930: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
f940: 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
f950: 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
f960: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
f970: 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
f980: 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
f990: 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
f9a0: 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
f9b0: 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
f9c0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
f9d0: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
f9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
f9f0: 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
fa00: 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
fa10: 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
fa20: 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
fa30: 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
fa40: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
fa50: 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
fa60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
fa70: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
fa80: 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
fa90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
faa0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
fab0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
fac0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
fad0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
fae0: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
faf0: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
fb00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
fb10: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
fb20: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
fb30: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
fb40: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
fb50: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
fb60: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
fb70: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
fb80: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
fb90: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
fba0: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
fbb0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
fbc0: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
fbd0: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
fbe0: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
fbf0: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
fc00: 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
fc10: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73  TE_NOMEM);.    s
fc20: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
fc30: 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
fc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc50: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
fc60: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
fc70: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
fc80: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
fc90: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
fca0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
fcb0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
fcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
fcd0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
fce0: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
fcf0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
fd00: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
fd10: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
fd20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fd30: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
fd40: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
fd50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
fd60: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
fd70: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
fd80: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
fd90: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
fda0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
fdb0: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
fdc0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
fdd0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
fde0: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
fdf0: 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
fe00: 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
fe10: 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
fe20: 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
fe30: 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
fe40: 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
fe50: 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
fe60: 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
fe70: 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
fe80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
fe90: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
fea0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
feb0: 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
fec0: 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
fed0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
fee0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
fef0: 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
ff00: 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
ff10: 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
ff20: 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
ff30: 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
ff40: 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
ff50: 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
ff60: 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
ff70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ff80: 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
ff90: 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
ffa0: 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
ffb0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
ffc0: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ffd0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
ffe0: 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
fff0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
10000 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10010 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
10020 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
10030 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
10040 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10050 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
10060 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
10070 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
10080 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
10090 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
100a0 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
100b0 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
100c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
100d0 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
100e0 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
100f0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
10100 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
10110 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
10120 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
10130 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
10140 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
10150 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
10160 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10170 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
10180 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
10190 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
101a0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
101b0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
101c0 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
101d0 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
101e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
101f0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
10200 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
10210 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
10220 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
10230 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
10240 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
10250 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
10260 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
10270 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
10280 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
10290 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
102a0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
102b0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
102c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
102d0 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
102e0 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
102f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
10300 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
10310 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
10320 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
10330 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
10340 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
10350 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10360 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
10370 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10380 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
10390 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
103a0 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
103b0 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
103c0 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
103d0 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
103e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
103f0 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
10400 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10410 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
10420 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10430 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
10440 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10460 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10470 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10480 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
10490 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
104a0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
104b0 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
104c0 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
104d0 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
104e0 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
104f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
10500 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
10510 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
10520 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
10530 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10540 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
10550 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
10560 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
10570 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
10580 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
10590 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
105a0 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
105b0 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
105c0 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
105d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
105e0 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
105f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10600 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
10610 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
10620 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
10630 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
10640 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
10650 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
10660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
10670 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
10680 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
10690 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
106a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
106b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
106c0 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
106d0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
106e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
106f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
10700 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
10710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
10720 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
10730 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
10740 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
10750 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10760 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10770 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  out;..  rc = sql
10780 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
10790 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
107a0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
107b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
107c0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
107d0 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
107e0 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
107f0 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
10800 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
10810 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
10820 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
10830 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
10840 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
10850 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
10860 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10870 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
10880 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
10890 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
108a0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
108b0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
108c0 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
108d0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
108e0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
108f0 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
10900 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
10910 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21   + 1);.    if( !
10920 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
10930 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10940 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10950 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10960 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
10970 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
10980 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
10990 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
109a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
109b0 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
109c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
109d0 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
109e0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  al, 0);.    if( 
109f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
10a00 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10a10 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a  ut;.    zMasterJ
10a20 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
10a30 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 20  urnal] = 0;..   
10a40 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
10a50 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
10a60 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
10a70 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
10a80 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
10a90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69  ){.      int exi
10aa0 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sts;.      rc = 
10ab0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
10ac0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
10ad0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
10ae0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
10af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b10 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
10b20 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
10b30 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20       if( exists 
10b40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
10b50 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
10b60 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
10b70 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10b80 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
10b90 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
10ba0 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
10bb0 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
10bc0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
10bd0 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
10be0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
10bf0 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
10c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
10c10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10c20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
10c30 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
10c40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
10c50 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
10c60 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
10c70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10c80 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
10c90 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
10ca0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
10cb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10cd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10ce0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
10cf0 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
10d00 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
10d10 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
10d20 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
10d30 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
10d40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
10d50 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
10d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
10d80 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
10d90 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
10da0 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
10db0 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
10dc0 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
10dd0 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
10de0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
10df0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
10e00 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
10e10 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
10e20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10e30 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
10e40 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10e50 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
10e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
10e70 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
10e80 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
10e90 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
10ea0 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
10eb0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
10ec0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
10ed0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
10ee0 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
10ef0 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
10f00 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
10f10 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
10f20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
10f30 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
10f40 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
10f50 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
10f60 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
10f70 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
10f80 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
10f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10fa0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10fb0 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
10fc0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
10fd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10fe0 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
10ff0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
11000 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
11010 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
11020 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
11030 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
11040 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
11050 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
11060 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
11070 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
11080 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
11090 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
110a0 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c  open, or an excl
110b0 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f  usive lock is no
110c0 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20  t.** held, this 
110d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
110e0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
110f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11100 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67  file is.** chang
11110 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
11120 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
11130 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
11140 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a  . If the file.**
11150 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
11160 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
11170 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
11180 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
11190 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
111a0 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
111b0 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
111c0 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62  it might might b
111d0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
111e0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
111f0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
11200 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
11210 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
11220 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
11230 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
11240 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
11250 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
11260 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
11270 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
11280 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
11290 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
112a0 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
112b0 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
112c0 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
112d0 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
112e0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
112f0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
11300 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
11310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
11320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
11330 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
11340 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
11350 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
11360 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
11370 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11390 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
113a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
113b0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
113c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
113d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
113e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
113f0 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28  USIVE && isOpen(
11400 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
11410 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
11420 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
11430 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
11440 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
11450 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
11460 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
11470 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11480 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
11490 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
114a0 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72  newSize = pPager
114b0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
114c0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
114d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
114e0 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
114f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
11500 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
11510 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
11520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11530 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
11540 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
11550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11570 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
11580 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a  d, "", 1, newSiz
11590 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e-1);.      }.  
115a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
115b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
115c0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
115d0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
115e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
115f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11600 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
11610 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
11620 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
11630 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
11640 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
11650 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
11660 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
11670 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
11680 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
11690 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
116a0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
116b0 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64  ill be used used
116c0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
116d0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
116e0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
116f0 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
11700 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11710 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
11720 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
11730 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
11740 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
11750 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
11760 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
11770 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
11780 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
11790 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
117a0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
117b0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
117c0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
117d0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
117e0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
117f0 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
11800 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
11810 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
11820 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
11830 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
11840 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
11850 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
11860 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
11870 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
11880 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
11890 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
118a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
118b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
118c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
118d0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
118e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
118f0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
11900 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
11910 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
11920 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
11930 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
11940 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
11950 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
11960 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
11970 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
11980 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
11990 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
119a0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
119b0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
119c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
119d0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
119e0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
119f0 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70  Size<32 ){.    p
11a00 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
11a10 65 20 3d 20 33 32 3b 0a 20 20 7d 0a 20 20 69 66  e = 32;.  }.  if
11a20 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
11a30 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
11a40 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
11a50 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
11a60 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
11a70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
11a80 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ze = MAX_SECTOR_
11a90 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  SIZE;.  }.}../*.
11aa0 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
11ab0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
11ac0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
11ad0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
11ae0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
11af0 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
11b00 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
11b10 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
11b20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11b30 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
11b40 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
11b50 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
11b60 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
11b70 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
11b80 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
11b90 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
11ba0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
11bb0 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
11bc0 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
11bd0 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
11be0 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
11bf0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
11c00 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
11c10 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
11c20 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
11c30 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
11c40 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
11c50 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
11c60 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
11c70 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
11c80 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
11c90 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
11ca0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
11cb0 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
11cc0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
11cd0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
11ce0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
11cf0 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
11d00 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
11d10 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
11d20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
11d30 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
11d40 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
11d50 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
11d60 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
11d70 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
11d80 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
11d90 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
11da0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
11db0 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
11dc0 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
11dd0 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
11de0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
11df0 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
11e00 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
11e10 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
11e20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
11e30 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
11e40 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
11e50 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
11e60 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
11e70 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
11e80 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
11e90 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
11ea0 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
11eb0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
11ec0 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
11ed0 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
11ee0 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
11ef0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
11f00 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
11f10 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
11f20 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
11f30 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
11f40 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
11f50 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
11f60 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
11f70 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
11f80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
11f90 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
11fa0 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
11fb0 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
11fc0 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
11fd0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
11fe0 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
11ff0 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
12000 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
12010 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
12020 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
12030 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
12040 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
12050 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
12060 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
12070 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
12080 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
12090 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
120a0 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
120b0 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
120c0 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
120d0 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
120e0 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
120f0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
12100 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
12110 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
12120 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
12130 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
12140 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
12150 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
12160 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
12170 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
12180 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
12190 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
121a0 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
121b0 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
121c0 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
121d0 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
121e0 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
121f0 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
12200 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
12210 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
12220 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
12230 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
12240 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
12250 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
12260 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
12270 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
12280 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
12290 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
122a0 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
122b0 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
122c0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
122d0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
122e0 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
122f0 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
12300 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
12310 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
12320 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
12330 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
12340 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
12350 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
12360 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
12370 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
12380 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
12390 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
123a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
123b0 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
123c0 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
123d0 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
123e0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
123f0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
12400 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
12410 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
12420 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
12430 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
12440 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12450 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
12460 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
12470 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
12480 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
12490 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
124a0 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
124b0 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
124c0 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
124d0 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
124e0 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
124f0 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
12500 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
12510 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
12520 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
12530 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
12540 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
12550 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
12560 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
12570 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
12580 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
12590 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
125a0 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
125b0 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
125c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
125d0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
125e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
125f0 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
12600 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
12610 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
12620 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
12630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12640 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
12650 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
12660 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12680 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
12690 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
126a0 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
126d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
126e0 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
126f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
12700 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
12710 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
12720 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12740 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
12750 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12760 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
12770 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
12780 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
12790 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
127a0 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
127b0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
127c0 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
127d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
127e0 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
127f0 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
12800 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
12810 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
12820 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
12830 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ack */..  /* Fig
12840 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
12850 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
12860 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
12870 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
12880 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
12890 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
128a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
128b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
128c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
128d0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
128e0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
128f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
12900 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
12910 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12920 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
12930 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
12940 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
12950 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
12960 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
12970 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
12980 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
12990 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
129a0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
129b0 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
129c0 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
129d0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
129e0 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
129f0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
12a00 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
12a10 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
12a20 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
12a30 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
12a40 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
12a50 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
12a60 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
12a70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
12a80 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
12a90 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
12aa0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
12ab0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
12ac0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
12ad0 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
12ae0 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
12af0 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
12b00 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
12b10 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
12b20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
12b30 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
12b40 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
12b50 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
12b60 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
12b70 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
12b80 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
12b90 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
12ba0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
12bb0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
12bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12bd0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
12be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12bf0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
12c00 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
12c10 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
12c20 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
12c30 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
12c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
12c50 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
12c60 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
12c70 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
12c80 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
12c90 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
12ca0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
12cb0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
12cc0 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
12cd0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
12ce0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
12cf0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
12d00 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
12d10 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
12d20 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
12d30 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
12d40 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
12d50 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20 3d 20   int isUnsync = 
12d60 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  0;..    /* Read 
12d70 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
12d80 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
12d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12da0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
12db0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
12dc0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
12dd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
12de0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
12df0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
12e00 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
12e10 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
12e20 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
12e30 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
12e40 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
12e50 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
12e60 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
12e70 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
12e80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
12e90 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
12ea0 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
12eb0 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
12ec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12ed0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
12ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
12ef0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
12f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12f10 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
12f20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
12f30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
12f40 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
12f50 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
12f60 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
12f70 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
12f80 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
12f90 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
12fa0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
12fb0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
12fc0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
12fd0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
12fe0 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
12ff0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
13000 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
13010 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
13020 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
13030 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
13040 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
13050 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
13060 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
13070 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13080 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
13090 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
130a0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
130b0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
130c0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
130d0 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
130e0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
130f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
13100 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
13110 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
13120 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
13130 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
13140 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
13150 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
13160 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
13170 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
13180 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
13190 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
131a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
131b0 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
131c0 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
131d0 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
131e0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
131f0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
13200 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
13210 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
13220 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
13230 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
13240 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
13250 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
13260 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
13270 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
13280 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
13290 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
132a0 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
132b0 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
132c0 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
132d0 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
132e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
132f0 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
13300 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
13310 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
13320 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
13330 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
13340 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
13350 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
13360 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
13370 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
13380 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
13390 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
133a0 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
133b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
133c0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
133d0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
133e0 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
133f0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
13400 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
13410 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
13420 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
13430 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
13440 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
13450 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13460 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
13470 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
13480 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
13490 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
134a0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
134b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
134c0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
134d0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69  Pager));.      i
134e0 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20  sUnsync = 1;.   
134f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
13500 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
13510 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
13520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
13530 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
13540 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
13550 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
13560 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
13570 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
13580 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
13590 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
135a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
135b0 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
135c0 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
135d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
135e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
135f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13600 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
13610 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
13620 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
13630 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
13640 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
13650 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13660 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
13670 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
13680 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
13690 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
136a0 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
136b0 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
136c0 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
136d0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
136e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
136f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
13700 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
13710 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
13720 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
13730 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
13740 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c  ager,1,isUnsync,
13750 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
13760 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  Off,0,0);.      
13770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
13790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
137a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
137b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
137c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
137d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
137e0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
137f0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
13800 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
13810 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
13820 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
13830 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
13840 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
13850 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
13860 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
13870 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
13880 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
13890 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
138a0 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
138b0 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
138c0 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
138d0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
138e0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
138f0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
13900 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
13910 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
13920 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13930 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13940 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
13950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13960 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
13970 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
13980 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
13990 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
139a0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
139b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
139c0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
139d0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
139e0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
139f0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
13a00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
13a10 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
13a20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
13a30 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
13a40 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
13a50 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
13a60 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
13a70 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
13a80 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
13a90 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
13aa0 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61   assert(.    pPa
13ab0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
13ac0 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69  s==0 ||.    sqli
13ad0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
13ae0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
13af0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
13b00 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45  ANGED,0)>=SQLITE
13b10 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  _OK.  );..  /* I
13b20 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
13b30 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
13b40 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
13b50 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
13b60 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
13b70 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
13b80 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
13b90 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
13ba0 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
13bb0 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
13bc0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
13bd0 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
13be0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
13bf0 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
13c00 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
13c10 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
13c20 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
13c30 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
13c40 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
13c50 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
13c60 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
13c70 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
13c80 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
13c90 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
13ca0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
13cb0 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
13cc0 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
13cd0 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
13ce0 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
13cf0 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
13d00 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
13d10 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
13d20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
13d30 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
13d40 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
13d50 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
13d60 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
13d70 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
13d80 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
13d90 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
13da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13db0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
13dc0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
13dd0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
13de0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
13df0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
13e00 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
13e10 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
13e20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13e30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13e40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
13e60 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
13e70 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
13e80 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
13e90 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
13eb0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
13ec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
13ed0 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
13ee0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
13ef0 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
13f00 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
13f10 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
13f20 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
13f30 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
13f40 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
13f50 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
13f60 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
13f70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
13f80 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
13f90 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
13fa0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
13fb0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
13fc0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
13fd0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
13fe0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
13ff0 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
14000 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
14010 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
14020 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
14030 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
14040 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
14050 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
14060 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
14070 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
14080 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
14090 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
140a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
140b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
140c0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
140d0 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
140e0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
140f0 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
14100 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
14110 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14120 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
14130 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
14140 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
14150 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
14160 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
14170 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
14180 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
14190 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
141a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
141b0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
141c0 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
141d0 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
141e0 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
141f0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
14200 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
14210 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
14220 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
14230 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
14240 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
14250 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
14260 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
14270 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
14280 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14290 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
142a0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
142b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
142c0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
142d0 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
142e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
142f0 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
14300 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14310 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
14320 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
14330 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14340 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
14350 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
14360 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14370 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
14380 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
14390 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
143a0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
143b0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
143c0 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
143d0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
143e0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
143f0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
14400 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14410 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
14420 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
14430 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
14440 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14450 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
14460 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
14470 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
14480 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
14490 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
144a0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
144b0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
144c0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
144d0 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
144e0 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
144f0 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
14500 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
14510 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
14520 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
14530 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
14540 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
14550 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
14560 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
14570 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
14580 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
14590 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
145a0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
145b0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
145c0 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
145d0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
145e0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
145f0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
14600 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
14610 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
14620 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14630 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
14640 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
14650 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
14660 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
14670 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
14680 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
14690 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
146a0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
146b0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
146c0 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
146d0 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
146e0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
146f0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
14700 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
14710 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
14720 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
14730 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
14740 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
14750 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
14760 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
14770 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
14780 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
14790 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
147a0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
147b0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
147c0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
147d0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
14800 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
14810 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
14820 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
14830 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
14840 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
14850 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
14860 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
14870 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14880 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
14890 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
148a0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
148b0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
148c0 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
148d0 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
148e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
148f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
14900 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
14910 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
14920 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
14930 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
14940 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
14950 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
14960 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
14970 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
14980 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
14990 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
149a0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
149b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
149c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
149d0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
149e0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
149f0 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
14a00 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
14a10 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
14a20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
14a30 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
14a40 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
14a50 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
14a60 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
14a70 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
14a80 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f  dbOrigSize;..  /
14a90 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
14aa0 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
14ab0 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
14ac0 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
14ad0 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
14ae0 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
14af0 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
14b00 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
14b10 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
14b20 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
14b30 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
14b40 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
14b50 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
14b60 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
14b70 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
14b80 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
14b90 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
14ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
14bb0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
14bc0 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
14bd0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
14be0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
14bf0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
14c00 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
14c10 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
14c20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
14c30 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
14c40 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
14c50 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
14c60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
14c70 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
14c80 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
14c90 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
14ca0 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
14cb0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
14cc0 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
14cd0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
14ce0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
14cf0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
14d00 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
14d10 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
14d20 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
14d30 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
14d40 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
14d50 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
14d60 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
14d70 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
14d80 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
14d90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
14da0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
14db0 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
14dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
14dd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14de0 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
14df0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
14e00 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
14e10 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
14e20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14e30 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
14e40 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
14e50 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
14e60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14e70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14e80 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
14e90 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
14ea0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
14eb0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
14ec0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
14ed0 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
14ee0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
14ef0 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
14f00 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
14f10 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
14f20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
14f30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
14f40 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
14f50 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
14f60 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
14f70 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
14f80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
14f90 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
14fa0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
14fb0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
14fc0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
14fd0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
14fe0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
14ff0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
15000 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
15010 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
15020 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
15030 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
15040 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
15050 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
15060 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
15070 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
15080 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15090 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
150a0 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
150b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
150c0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
150d0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
150e0 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
150f0 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
15100 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
15110 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
15120 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
15130 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
15140 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
15150 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15160 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
15170 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
15180 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
15190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
151a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
151b0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
151c0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
151d0 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
151e0 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
151f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
15200 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
15210 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
15220 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
15230 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
15240 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
15250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
15260 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
15270 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
15280 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
15290 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72  r, 1, 0, &pPager
152a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c  ->journalOff, 1,
152b0 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20   pDone);.    }. 
152c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
152d0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
152e0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
152f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
15300 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
15310 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
15320 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
15330 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
15340 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
15350 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
15360 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
15370 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
15380 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15390 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
153a0 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
153b0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
153c0 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
153d0 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
153e0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
153f0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
15400 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
15410 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15420 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
15430 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70   offset = pSavep
15440 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
15450 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
15460 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70  e);.    for(ii=p
15470 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
15480 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
15490 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
154a0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
154b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
154c0 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67  fset==ii*(4+pPag
154d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
154e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
154f0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
15500 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30  age(pPager, 0, 0
15510 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44  , &offset, 1, pD
15520 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  one);.    }.    
15530 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15540 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
15550 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
15560 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
15570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15580 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
15590 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
155a0 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  zJ;.  }.  return
155b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
155c0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
155d0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
155e0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
155f0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
15600 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
15610 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
15620 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
15630 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
15640 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
15650 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
15660 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
15670 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
15680 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
15690 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
156a0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
156b0 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
156c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
156d0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
156e0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
156f0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
15700 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
15710 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
15720 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
15730 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
15740 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
15750 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
15760 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
15770 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
15780 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
15790 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
157a0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
157b0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
157c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
157d0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
157e0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
157f0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
15800 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
15810 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
15820 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
15830 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
15840 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
15850 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
15860 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
15870 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
15880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15890 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
158a0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
158b0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
158c0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
158d0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
158e0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
158f0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
15900 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
15920 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
15930 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
15940 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
15950 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
15960 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
15970 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
15980 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
15990 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
159a0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
159b0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
159c0 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
159d0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
159e0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
159f0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
15a00 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
15a10 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
15a20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
15a30 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
15a40 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
15a50 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
15a60 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
15a70 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
15a80 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
15a90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
15aa0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
15ab0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
15ac0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
15ad0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
15ae0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
15af0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
15b00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
15b10 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
15b20 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
15b30 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
15b40 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
15b50 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
15b60 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
15b70 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
15b80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
15b90 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
15ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15bb0 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
15bc0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
15bd0 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46  evel, int bFullF
15be0 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
15bf0 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
15c00 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
15c10 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
15c20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
15c30 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
15c40 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
15c50 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
15c60 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
15c70 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
15c80 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
15c90 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
15ca0 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
15cb0 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
15cc0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
15cd0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15ce0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
15cf0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
15d00 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
15d10 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
15d20 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
15d30 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
15d40 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
15d50 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
15d60 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
15d70 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
15d80 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
15d90 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
15da0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
15db0 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
15dc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
15dd0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
15de0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
15df0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15e00 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
15e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15e20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
15e30 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
15e40 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
15e50 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
15e60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
15e70 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
15e80 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
15e90 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
15ea0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
15eb0 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
15ec0 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
15ed0 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
15ee0 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
15ef0 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
15f00 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
15f10 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
15f20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
15f30 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
15f40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
15f50 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
15f60 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
15f70 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
15f80 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
15f90 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
15fa0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
15fb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
15fc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15fd0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
15fe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
15ff0 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
16000 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16010 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
16020 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
16030 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
16040 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
16050 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
16060 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16070 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
16080 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
16090 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
160a0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
160b0 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
160c0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
160d0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
160e0 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
160f0 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
16100 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
16110 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16120 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
16130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
16140 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
16150 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
16160 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
16170 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
16180 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
16190 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
161a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
161b0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
161c0 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
161d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
161e0 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
161f0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
16200 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
16210 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
16220 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
16230 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
16240 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
16250 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
16260 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
16270 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
16280 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
16290 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
162a0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
162b0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
162c0 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
162d0 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
162e0 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
162f0 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
16300 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
16310 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
16320 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
16330 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
16340 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
16350 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
16360 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
16370 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
16380 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
16390 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
163c0 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16400 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
16410 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
16420 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
16430 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
16440 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
16450 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
16460 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
16470 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
16480 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
16490 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
164a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
164b0 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
164c0 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
164d0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
164e0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
164f0 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
16500 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
16510 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
16520 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
16530 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
16540 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
16550 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
16560 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
16570 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
16580 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
16590 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
165a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
165b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
165c0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
165d0 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
165e0 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
165f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
16600 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
16610 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
16620 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
16630 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
16640 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
16650 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
16660 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
16670 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
16680 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
16690 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
166a0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
166b0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
166c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
166d0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
166e0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
166f0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16700 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
16710 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
16720 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16730 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
16740 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
16750 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
16760 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
16770 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
16780 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
16790 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
167a0 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
167b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
167e0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
167f0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
16800 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
16810 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
16820 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
16830 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
16840 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
16850 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16860 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
16870 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
16880 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
16890 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
168a0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
168b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
168c0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
168d0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
168e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
168f0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
16900 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
16910 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
16920 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
16930 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
16940 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
16950 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
16960 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
16970 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
16980 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
16990 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
169a0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
169b0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
169c0 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
169d0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
169e0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
169f0 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
16a00 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
16a10 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
16a20 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
16a30 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
16a40 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
16a50 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
16a60 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
16a70 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
16a80 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
16a90 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
16aa0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
16ab0 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
16ac0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
16ad0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
16ae0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
16af0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
16b00 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
16b10 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
16b20 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
16b30 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
16b40 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
16b50 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
16b60 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
16b70 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
16b80 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
16b90 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
16ba0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
16bb0 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
16bc0 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
16bd0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
16be0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
16bf0 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
16c00 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
16c10 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
16c20 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
16c30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16c40 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
16c50 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
16c60 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
16c70 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
16c80 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
16c90 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
16ca0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
16cb0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
16cc0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
16cd0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
16ce0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
16cf0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
16d00 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
16d10 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
16d20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
16d30 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
16d40 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
16d50 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
16d60 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
16d70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
16d80 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
16d90 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
16da0 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
16db0 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
16dc0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
16dd0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ode;..  if( rc==
16de0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16df0 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20   u16 pageSize = 
16e00 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  *pPageSize;.    
16e10 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
16e20 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
16e30 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
16e40 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
16e50 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20  GE_SIZE) );.    
16e60 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
16e70 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
16e80 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20  >dbSize==0).    
16e90 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
16ea0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
16eb0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
16ec0 20 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20      && pageSize 
16ed0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
16ee0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
16ef0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
16f00 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   *pNew = (char *
16f10 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
16f20 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
16f30 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
16f40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
16f50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16f70 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
16f80 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
16f90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
16fa0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
16fb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
16fc0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
16fd0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
16fe0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
16ff0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
17000 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
17010 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
17020 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
17030 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
17040 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
17050 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  ze = (u16)pPager
17060 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17070 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
17080 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
17090 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
170a0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
170b0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
170c0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
170d0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
170e0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
170f0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
17100 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
17110 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17120 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
17130 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
17140 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
17150 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
17160 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
17170 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
17180 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
17190 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
171a0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
171b0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
171c0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
171d0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
171e0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
171f0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
17200 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
17210 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
17220 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
17230 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
17240 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
17250 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
17260 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
17270 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
17280 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
17290 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
172a0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
172b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
172c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
172d0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
172e0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
172f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
17300 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
17310 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
17320 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
17330 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
17340 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
17350 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
17360 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
17370 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
17380 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
17390 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
173a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
173b0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
173c0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
173d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
173e0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
173f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17400 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
17410 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17420 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
17430 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
17440 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
17450 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
17460 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
17470 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
17480 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
17490 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
174a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
174b0 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
174c0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
174d0 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
174e0 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
174f0 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
17500 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
17510 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
17520 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
17530 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
17540 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
17550 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
17560 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
17570 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
17580 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
17590 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
175a0 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
175b0 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
175c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
175d0 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
175e0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
175f0 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
17600 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17610 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
17620 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
17630 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
17640 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
17650 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
17660 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
17670 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
17680 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
17690 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
176a0 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
176b0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
176c0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
176d0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
176e0 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
176f0 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
17700 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
17710 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17720 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
17730 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17740 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
17750 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
17760 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
17770 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
17780 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
17790 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
177a0 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
177b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
177c0 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
177d0 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
177e0 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
177f0 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
17800 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
17810 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
17820 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
17830 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
17840 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
17850 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
17860 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
17870 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
17880 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
17890 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
178a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
178b0 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
178c0 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
178d0 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
178e0 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
178f0 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
17900 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
17910 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
17920 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
17930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
17940 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
17950 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
17960 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
17970 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
17980 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
17990 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
179a0 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
179b0 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
179c0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
179d0 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
179e0 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
179f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
17a00 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
17a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
17a20 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
17a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
17a40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
17a50 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
17a60 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ile );.  if( isO
17a70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
17a80 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
17a90 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
17aa0 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
17ab0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17ac0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17ad0 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
17ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17af0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
17b00 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
17b10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17b20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
17b40 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
17b50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
17b60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17b70 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  le associated .*
17b80 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e  * with pPager. N
17b90 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  ormally, this is
17ba0 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28   calculated as (
17bb0 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c  <db file size>/<
17bc0 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20  page-size>)..** 
17bd0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
17be0 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
17bf0 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
17c00 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
17c10 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
17c20 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
17c30 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   page file..**.*
17c40 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
17c50 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
17c60 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
17c70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
17c80 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  hen the.** error
17c90 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
17ca0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
17cb0 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75  d *pnPage left u
17cc0 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a  nchanged. Or,.**
17cd0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73   if the file sys
17ce0 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75  tem has to be qu
17cf0 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69  eried for the si
17d00 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  ze of the file a
17d10 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20  nd.** the query 
17d20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20  attempt returns 
17d30 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65  an IO error, the
17d40 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
17d50 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
17d60 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
17d70 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
17d80 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
17d90 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
17da0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
17db0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17dc0 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e  urned.** and *pn
17dd0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74  Page is set to t
17de0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
17df0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
17e00 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
17e10 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17e20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17e30 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
17e40 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
17e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
17e60 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
17e70 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
17e80 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
17e90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
17ea0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
17eb0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
17ec0 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ode. */.  if( pP
17ed0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
17ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
17ef0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
17f00 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
17f10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
17f20 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
17f30 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20  . Store this in 
17f40 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  nPage. */.  if( 
17f50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
17f60 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  lid ){.    nPage
17f70 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
17f80 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
17f90 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17fa0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
17fb0 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
17fc0 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20  ileSize() */.   
17fd0 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
17fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
17ff0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72   size in bytes r
18000 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
18010 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20  eSize() */..    
18020 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
18030 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
18040 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18050 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
18060 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20  (pPager->fd) && 
18070 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
18080 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
18090 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20  ager->fd, &n))) 
180a0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
180b0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
180c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
180d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
180e0 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
180f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
18100 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
18110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18120 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
18130 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
18140 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
18150 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
18160 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18170 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18180 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
18190 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
181a0 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
181b0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
181c0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31  >dbSizeValid = 1
181d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
181e0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
181f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18200 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
18210 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
18220 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65   .  ** configure
18230 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
18240 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
18250 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
18260 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
18270 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
18280 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
18290 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
182a0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
182b0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
182c0 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
182d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
182e0 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64  put variable and
182f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18300 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67  K */.  if( pnPag
18310 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65  e ){.    *pnPage
18320 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
18330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18340 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
18350 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
18360 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
18370 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
18380 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
18390 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
183a0 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
183b0 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
183c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
183d0 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
183e0 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
183f0 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
18400 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
18410 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
18420 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
18430 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
18440 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
18450 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
18460 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
18470 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
18480 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
18490 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
184a0 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
184b0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
184c0 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
184d0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
184e0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
184f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18500 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
18510 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
18520 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
18530 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
18540 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
18550 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
18560 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
18570 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
18580 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
18590 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
185a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
185b0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
185c0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
185d0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
185e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18610 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
18620 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
18630 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
18640 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
18650 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
18660 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
18670 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
18680 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18690 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
186a0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
186b0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
186c0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
186d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
186e0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
186f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
18700 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
18710 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
18720 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
18730 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18740 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
18750 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
18760 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  lid==0 );..  /* 
18770 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
18780 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
18790 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
187a0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
187b0 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
187c0 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
187d0 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
187e0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
187f0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
18800 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
18810 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
18820 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
18830 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
18840 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
18850 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
18860 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
18870 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  e>=locktype).   
18880 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
18890 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
188a0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
188b0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
188c0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
188d0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
188e0 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74  ESERVED && lockt
188f0 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55  ype==PAGER_EXCLU
18900 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66  SIVE).  );..  if
18910 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18920 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
18930 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
18950 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
18960 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
18970 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
18980 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
18990 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
189a0 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
189b0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
189c0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
189d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
189e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
189f0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18a00 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
18a10 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18a20 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
18a30 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
18a40 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
18a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18a60 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
18a70 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
18a80 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
18a90 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
18aa0 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
18ab0 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
18ac0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
18ad0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
18ae0 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
18af0 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
18b00 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
18b10 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
18b20 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
18b30 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
18b40 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
18b50 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
18b60 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
18b70 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
18b80 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
18b90 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
18ba0 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
18bb0 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
18bc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
18bd0 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
18be0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
18bf0 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
18c00 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
18c10 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
18c20 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
18c30 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
18c40 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
18c50 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
18c60 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
18c70 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
18c80 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
18c90 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
18ca0 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
18cb0 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
18cc0 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
18cd0 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
18ce0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
18cf0 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
18d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18d10 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
18d20 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
18d30 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
18d40 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
18d50 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
18d60 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20  behaviour would 
18d70 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
18d80 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
18d90 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
18da0 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
18db0 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
18dc0 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
18dd0 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
18de0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
18df0 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
18e00 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
18e10 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
18e20 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
18e30 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
18e40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
18e50 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
18e60 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
18e70 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
18e80 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
18e90 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
18ea0 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
18eb0 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
18ec0 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
18ed0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
18ee0 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
18ef0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
18f00 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
18f10 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
18f20 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
18f30 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
18f40 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
18f50 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
18f60 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
18f70 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
18f80 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
18f90 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
18fa0 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
18fb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
18fc0 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
18fd0 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
18fe0 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
18ff0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
19000 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
19010 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
19020 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
19030 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
19040 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
19050 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
19060 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
19070 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
19080 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
19090 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
190a0 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
190b0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
190c0 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
190d0 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
190e0 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
190f0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
19100 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
19110 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
19120 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
19130 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
19140 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
19150 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
19160 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
19170 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19180 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
19190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
191a0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
191b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
191c0 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
191d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
191e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
191f0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70  _RESERVED );.  p
19200 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
19210 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54  nPage;.  assertT
19220 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
19230 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
19240 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
19250 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
19260 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
19270 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
19280 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
19290 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
192a0 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
192b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
192c0 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
192d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
192e0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
192f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
19300 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
19310 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
19320 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
19330 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
19340 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
19350 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
19360 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
19370 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
19380 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
19390 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
193a0 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
193b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
193c0 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
193d0 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
193e0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
193f0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
19400 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
19410 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
19420 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
19430 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
19440 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
19450 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
19460 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
19470 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
19480 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
19490 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
194a0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
194b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
194c0 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
194d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
194e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
194f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
19500 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
19510 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
19520 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
19530 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65   0;.  pager_rese
19540 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
19550 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
19560 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
19570 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
19580 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f   /* Set Pager.jo
19590 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66  urnalHdr to -1 f
195a0 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f  or the benefit o
195b0 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  f the pager_play
195c0 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63  back() .    ** c
195d0 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65  all which may be
195e0 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69   made from withi
195f0 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  n pagerUnlockAnd
19600 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69  Rollback(). If i
19610 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
19620 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73  -1, then the uns
19630 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
19640 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
19650 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a   file may.    **
19660 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
19670 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19680 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
19690 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
196a0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
196b0 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
196c0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
196d0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
196e0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
196f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31  >journalHdr = -1
19700 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
19710 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
19720 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
19730 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
19740 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
19750 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
19760 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
19770 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
19780 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19790 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
197a0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
197b0 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
197c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
197d0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
197e0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
197f0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
19800 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
19810 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
19820 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
19830 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
19840 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
19850 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
19860 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
19870 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
19880 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
19890 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
198a0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
198b0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
198c0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
198d0 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
198e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
198f0 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
19900 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
19910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19920 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
19930 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
19940 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
19950 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
19960 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
19970 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
19980 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
19990 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
199a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
199b0 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
199c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
199d0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
199e0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
199f0 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
19a00 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
19a10 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
19a20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19a30 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
19a40 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
19a50 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
19a60 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
19a70 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
19a80 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
19a90 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
19aa0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
19ab0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
19ac0 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
19ad0 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
19ae0 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
19af0 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
19b00 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
19b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
19b20 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
19b30 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  ag is not set, t
19b40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
19b50 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e  n is a.** no-op.
19b60 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
19b70 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
19b80 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
19b90 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61  ournal-mode.** a
19ba0 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63 68  nd the device ch
19bb0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
19bc0 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
19bd0 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
19be0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
19bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
19c00 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
19c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
19c20 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
19c30 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
19c40 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
19c50 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
19c60 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19c70 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
19c80 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
19c90 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
19ca0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
19cb0 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
19cc0 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
19cd0 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
19ce0 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
19cf0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
19d00 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
19d10 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
19d20 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
19d30 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
19d40 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
19d50 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
19d60 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
19d70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
19d80 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
19d90 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
19da0 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
19db0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
19dc0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
19dd0 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
19de0 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
19df0 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
19e00 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
19e10 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
19e20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
19e30 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
19e40 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
19e50 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
19e60 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
19e70 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
19e80 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
19e90 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
19ea0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
19eb0 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
19ec0 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
19ed0 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
19ee0 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
19ef0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
19f00 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
19f10 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  The Pager.needSy
19f20 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72  nc flag is never
19f30 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70   be set for temp
19f40 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20  orary files, or 
19f50 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72  any.** file oper
19f60 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  ating in no-sync
19f70 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53   mode (Pager.noS
19f80 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a  ync set to non-z
19f90 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ero)..**.** If s
19fa0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
19fb0 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
19fc0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
19fd0 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
19fe0 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
19ff0 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
1a000 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
1a010 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
1a020 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
1a030 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1a040 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1a050 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a060 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1a070 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a080 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
1a090 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a0a0 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
1a0b0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
1a0c0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1a0d0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1a0e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1a0f0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1a100 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
1a110 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20  .      int rc;  
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a140 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1a150 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
1a160 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1a170 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a180 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1a190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1a1a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1a1b0 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1a1c0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1a1d0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1a1e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1a1f0 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
1a200 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
1a210 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
1a220 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
1a230 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
1a240 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
1a250 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
1a260 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
1a270 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
1a280 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
1a290 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1a2a0 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
1a2b0 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
1a2c0 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
1a2d0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
1a2e0 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
1a2f0 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
1a300 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
1a310 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
1a320 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
1a330 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1a340 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
1a350 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
1a360 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
1a370 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74  ections transact
1a380 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
1a390 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
1a3a0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
1a3b0 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
1a3c0 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
1a3d0 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
1a3e0 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
1a3f0 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
1a400 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
1a410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
1a420 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
1a430 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
1a440 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
1a450 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
1a460 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
1a470 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
1a480 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
1a490 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1a4a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
1a4b0 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
1a4c0 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
1a4d0 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
1a4e0 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
1a4f0 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
1a500 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
1a510 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
1a520 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
1a530 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
1a540 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
1a550 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
1a560 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
1a570 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
1a580 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
1a590 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
1a5a0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
1a5b0 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
1a5c0 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
1a5d0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1a5e0 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
1a5f0 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
1a600 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
1a610 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
1a620 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
1a630 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
1a640 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1a650 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
1a660 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
1a670 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
1a680 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
1a690 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
1a6a0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
1a6b0 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
1a6c0 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
1a6d0 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
1a6e0 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
1a6f0 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
1a700 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
1a710 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
1a720 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
1a730 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
1a740 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1a750 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
1a760 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
1a770 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
1a780 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65 72  [8];..u8 zHeader
1a790 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1a7a0 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d  Magic)+4];...mem
1a7b0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1a7c0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1a7d0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1a7e0 29 29 3b 0a 09 70 75 74 33 32 62 69 74 73 28 26  ));..put32bits(&
1a7f0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1a800 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
1a810 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1a820 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
1a830 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1a840 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1a850 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a860 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1a870 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1a880 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1a890 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1a8a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a8b0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1a8c0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1a8d0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1a8e0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1a8f0 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1a900 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1a910 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a920 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1a930 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1a940 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1a950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1a960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a970 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1a980 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1a990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1a9a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1a9b0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1a9c0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1a9d0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1a9e0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1a9f0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1aa00 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1aa10 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1aa20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1aa30 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1aa40 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1aa50 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1aa60 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1aa70 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1aa80 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1aa90 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1aaa0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1aab0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1aac0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1aad0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1aae0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1aaf0 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1ab00 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1ab10 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1ab20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1ab30 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1ab40 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1ab50 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1ab60 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1ab70 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1ab80 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1ab90 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1aba0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1abb0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1abc0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1abd0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1abe0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1abf0 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1ac00 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1ac10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ac20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1ac30 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1ac40 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1ac50 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1ac60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ac70 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1ac80 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1ac90 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1aca0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1acb0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1acc0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1acd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ace0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1acf0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1ad00 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1ad10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ad20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ad30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ad40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1ad50 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
1ad60 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
1ad70 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
1ad80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad90 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
1ada0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
1adb0 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
1adc0 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
1add0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09  er->journalHdr..
1ade0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1adf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1ae00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ae10 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1ae20 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1ae30 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1ae40 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ae50 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1ae60 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1ae70 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1ae80 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1ae90 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1aea0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1aeb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1aec0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1aed0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1aee0 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1aef0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1af00 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1af10 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1af20 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1af30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1af40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1af50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1af60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1af70 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1af80 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1af90 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1afa0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1afb0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1afc0 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1afd0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1afe0 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1aff0 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1b000 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1b010 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1b020 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1b030 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  ted = 1;.    sql
1b040 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1b050 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1b060 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1b070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b080 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1b090 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b0a0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1b0b0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1b0c0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1b0d0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1b0e0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1b0f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b100 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1b110 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1b120 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1b130 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1b140 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1b150 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1b160 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1b170 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1b180 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1b190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b1a0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1b1b0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1b1c0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1b1d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1b1e0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1b1f0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1b200 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1b210 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1b220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1b230 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1b240 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1b250 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1b260 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1b270 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1b280 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1b290 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1b2a0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1b2b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b2c0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1b2d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1b2e0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1b2f0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1b300 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1b310 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1b320 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1b330 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1b340 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1b350 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1b360 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1b370 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1b380 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1b390 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1b3a0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1b3b0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1b3c0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1b3d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1b3e0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1b3f0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1b400 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1b410 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1b420 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1b430 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1b440 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1b450 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b460 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1b470 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1b480 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1b490 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1b4a0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1b4b0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1b4c0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1b4d0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1b4e0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1b4f0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1b500 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1b510 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1b520 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1b530 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1b540 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1b550 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1b560 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1b570 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1b580 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1b590 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1b5a0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1b5b0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1b5c0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1b5d0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1b5e0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1b5f0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1b600 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1b610 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1b620 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1b630 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1b640 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1b650 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1b660 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1b670 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1b680 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1b690 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1b6c0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b6f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1b700 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74   if( NEVER(pList
1b710 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51  ==0) ) return SQ
1b720 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
1b730 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
1b740 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
1b750 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
1b760 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
1b770 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
1b780 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
1b790 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b7a0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
1b7b0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
1b7c0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
1b7d0 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
1b7e0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
1b7f0 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
1b800 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
1b810 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
1b820 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
1b830 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
1b840 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
1b850 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
1b860 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
1b870 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
1b880 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
1b890 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
1b8a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b8b0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
1b8c0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
1b8d0 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
1b8e0 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
1b8f0 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
1b900 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
1b910 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
1b920 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
1b930 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
1b940 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
1b950 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
1b960 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
1b970 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
1b980 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
1b990 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1b9a0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
1b9b0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
1b9c0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
1b9d0 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
1b9e0 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1b9f0 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1ba00 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1ba10 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1ba20 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1ba30 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1ba40 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1ba50 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1ba60 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1ba70 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1ba80 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1ba90 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1baa0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1bab0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1bac0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1bad0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1bae0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1baf0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1bb00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
1bb10 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
1bb20 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
1bb30 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
1bb40 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
1bb50 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1bb60 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
1bb70 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1bb80 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
1bb90 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
1bba0 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
1bbb0 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
1bbc0 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
1bbd0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
1bbe0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1bbf0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1bc00 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1bc10 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1bc20 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
1bc30 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
1bc40 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
1bc50 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
1bc60 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  s);.  }..  while
1bc70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bc80 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
1bc90 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
1bca0 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
1bcb0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1bcc0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
1bcd0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
1bce0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1bcf0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
1bd00 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1bd10 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
1bd20 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1bd30 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
1bd40 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
1bd50 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
1bd60 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
1bd70 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
1bd80 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
1bd90 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
1bda0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
1bdb0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1bdc0 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
1bdd0 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
1bde0 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
1bdf0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1be00 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
1be10 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
1be20 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
1be30 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  .  Note that if 
1be40 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20  compiled with.  
1be50 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53 45 43 55    ** SQLITE_SECU
1be60 52 45 5f 44 45 4c 45 54 45 20 74 68 65 20 50 47  RE_DELETE the PG
1be70 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 62  HDR_DONT_WRITE b
1be80 69 74 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  it is never set 
1be90 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68  and so.    ** th
1bea0 65 20 73 65 63 6f 6e 64 20 74 65 73 74 20 69 73  e second test is
1beb0 20 61 6c 77 61 79 73 20 74 72 75 65 2e 0a 20 20   always true..  
1bec0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
1bed0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
1bee0 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
1bef0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
1bf00 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
1bf10 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
1bf20 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1bf30 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
1bf40 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
1bf50 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
1bf60 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1bf90 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
1bfa0 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63    ..      /* Enc
1bfb0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
1bfc0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
1bfd0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
1bfe0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
1bff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1c000 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
1c010 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
1c020 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
1c030 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1c040 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c050 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
1c060 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c070 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
1c080 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
1c090 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
1c0a0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
1c0b0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
1c0c0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
1c0d0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
1c0e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c0f0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
1c100 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
1c110 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
1c120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1c130 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
1c140 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
1c150 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
1c160 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1c170 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1c180 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1c190 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1c1a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c1b0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1c1c0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1c1d0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1c1e0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1c1f0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c200 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
1c210 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
1c220 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
1c230 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
1c240 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
1c250 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
1c260 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1c270 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1c280 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
1c290 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
1c2a0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1c2b0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
1c2c0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1c2d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c2e0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c2f0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1c300 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1c310 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
1c320 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
1c330 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1c340 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
1c350 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1c360 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
1c370 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
1c380 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
1c390 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ite);.    }else{
1c3a0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1c3b0 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
1c3c0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1c3d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1c3e0 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ));.    }.#ifdef
1c3f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1c400 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
1c410 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1c420 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
1c430 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
1c440 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1c450 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
1c460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
1c470 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
1c480 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1c490 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
1c4a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1c4b0 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
1c4c0 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
1c4d0 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
1c4e0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1c4f0 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
1c500 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
1c510 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1c520 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1c530 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1c540 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
1c550 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
1c560 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
1c570 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
1c580 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
1c590 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
1c5a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1c5b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1c5c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
1c5d0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1c5e0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1c5f0 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
1c600 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
1c610 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
1c620 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1c630 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
1c640 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
1c650 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
1c660 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
1c670 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
1c680 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
1c690 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
1c6a0 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
1c6b0 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
1c6c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1c6d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1c6e0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
1c6f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c700 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  >sjfd) ){.    vo
1c710 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
1c720 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20  >pData;.    i64 
1c730 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1c740 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
1c750 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c760 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
1c770 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50 61  ..    CODEC2(pPa
1c780 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1c790 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
1c7a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
1c7b0 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47 45  Data2);.    PAGE
1c7c0 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
1c7d0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1c7e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c7f0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1c800 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74  );.  .    assert
1c810 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
1c820 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
1c830 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
1c840 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  Size );.    rc =
1c850 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1c860 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
1c870 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
1c880 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c8a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1c8b0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
1c8c0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1c8d0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1c8e0 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +4);.    }.  }. 
1c8f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c900 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
1c910 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
1c920 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c930 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
1c940 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
1c950 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
1c960 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1c970 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
1c980 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1c990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c9a0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
1c9b0 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
1c9c0 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
1c9d0 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
1c9e0 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
1c9f0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1ca00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
1ca10 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
1ca20 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
1ca30 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
1ca40 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
1ca50 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
1ca60 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
1ca70 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
1ca80 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
1ca90 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
1caa0 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
1cab0 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
1cac0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1cad0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
1cae0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
1caf0 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
1cb00 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
1cb10 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1cb20 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
1cb30 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
1cb40 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
1cb50 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
1cb60 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
1cb70 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
1cb80 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
1cb90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1cba0 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
1cbb0 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
1cbc0 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
1cbd0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
1cbe0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1cbf0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1cc00 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
1cc10 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
1cc20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1cc30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1cc40 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1cc50 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
1cc60 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
1cc70 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
1cc80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1cc90 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
1cca0 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
1ccb0 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
1ccc0 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
1ccd0 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
1cce0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
1ccf0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1cd00 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1cd10 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1cd20 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
1cd30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1cd40 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
1cd50 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
1cd60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1cd70 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
1cd80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cd90 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1cda0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
1cdb0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
1cdc0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1cdd0 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
1cde0 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   The doNotSync f
1cdf0 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68  lag is set by th
1ce00 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1ce10 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77  ite() function w
1ce20 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  hile it.  ** is 
1ce30 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65  journalling a se
1ce40 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  t of two or more
1ce50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
1ce60 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a  that are stored.
1ce70 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65    ** on the same
1ce80 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79   disk sector. Sy
1ce90 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ncing the journa
1cea0 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  l is not allowed
1ceb0 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73   while.  ** this
1cec0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73   is happening as
1ced0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
1cee0 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72   that all member
1cef0 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a  s of such a.  **
1cf00 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61 72   set of pages ar
1cf10 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1cf20 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69   together. So, i
1cf30 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73 20  f the page this 
1cf40 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
1cf50 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
1cf60 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69  clean will requi
1cf70 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  re a journal syn
1cf80 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53  c and the doNotS
1cf90 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  ync.  ** flag is
1cfa0 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74   set, return wit
1cfb0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
1cfc0 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65 20  ing. The pcache 
1cfd0 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20  layer will.  ** 
1cfe0 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20  just have to go 
1cff0 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61  ahead and alloca
1d000 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62 75  te a new page bu
1d010 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a  ffer instead of.
1d020 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67    ** reusing pPg
1d030 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69  ..  **.  ** Simi
1d040 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61  larly, if the pa
1d050 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
1d060 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
1d070 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a  r state, do not.
1d080 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74    ** try to writ
1d090 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d0a0 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20  f pPg to disk.. 
1d0b0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
1d0c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
1d0d0 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  .   || (pPager->
1d0e0 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67  doNotSync && pPg
1d0f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1d100 45 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20 20  ED_SYNC).  ){.  
1d110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d120 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79  OK;.  }..  /* Sy
1d130 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1d140 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
1d150 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
1d160 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d170 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  SYNC ){.    rc =
1d180 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1d190 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d1b0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1d1c0 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67  && .      !(pPag
1d1d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1d1e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1d1f0 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
1d200 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
1d210 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1d220 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1d230 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1d240 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29  FE_APPEND).    )
1d250 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1d260 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1d270 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1d280 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1d290 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1d2a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1d2b0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
1d2c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1d2d0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1d2e0 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1d2f0 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
1d300 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
1d310 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
1d320 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69  ournal..  ** Thi
1d330 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
1d340 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
1d350 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
1d360 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
1d370 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
1d380 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
1d390 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
1d3a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73  ..  **.  ** Cons
1d3b0 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1d3c0 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
1d3d0 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  vents:.  **.  **
1d3e0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
1d3f0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
1d400 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f   X>.  **     <mo
1d410 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a  dify page X>.  *
1d420 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
1d430 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  sp;.  **       <
1d440 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
1d450 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
1d460 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65  .  **       page
1d470 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
1d480 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
1d490 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20  K TO sp;.  **.  
1d4a0 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
1d4b0 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
1d4c0 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
1d4d0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
1d4e0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74  written.  ** out
1d4f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d500 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
1d510 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
1d520 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
1d530 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
1d540 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1d550 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
1d560 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
1d570 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61  ill read.  ** da
1d580 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
1d590 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
1d5a0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
1d5b0 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
1d5c0 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74  .  ** was when t
1d5d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1d5e0 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
1d5f0 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
1d600 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77  POINT sp".  ** w
1d610 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  as executed..  *
1d620 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74  *.  ** The solut
1d630 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
1d640 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1d650 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
1d660 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
1d670 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
1d680 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1d690 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
1d6a0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
1d6b0 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
1d6c0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
1d6d0 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
1d6e0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
1d6f0 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e   .  ** executed.
1d700 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
1d710 52 28 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  R(.      rc==SQL
1d720 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
1d730 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
1d740 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
1d750 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 29 20  esPage(pPg).  ) 
1d760 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  ){.    rc = subj
1d770 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
1d780 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
1d790 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1d7a0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
1d7b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d7c0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  le. */.  if( rc=
1d7d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d7e0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
1d7f0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
1d800 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1d810 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
1d820 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
1d830 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
1d840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d850 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
1d860 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
1d870 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1d880 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1d890 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
1d8a0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1d8b0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
1d8c0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1d8d0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1d8e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
1d8f0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1d900 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
1d910 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
1d920 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
1d930 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
1d940 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
1d950 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
1d960 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
1d970 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1d980 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
1d990 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1d9a0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
1d9b0 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
1d9c0 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
1d9d0 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
1d9e0 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
1d9f0 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
1da00 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
1da10 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
1da20 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
1da30 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
1da40 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
1da50 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
1da60 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1da70 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
1da80 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
1da90 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
1daa0 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
1dab0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
1dac0 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
1dad0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
1dae0 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
1daf0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
1db00 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
1db10 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1db20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
1db30 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
1db40 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
1db50 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
1db60 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
1db70 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
1db80 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
1db90 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
1dba0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
1dbb0 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
1dbc0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
1dbd0 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
1dbe0 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
1dbf0 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
1dc00 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
1dc10 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
1dc20 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
1dc30 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
1dc40 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
1dc50 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
1dc60 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
1dc70 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f   the PAGER_OMIT_
1dc80 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45  JOURNAL and PAGE
1dc90 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c  R_NO_READLOCK fl
1dca0 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
1dcb0 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  fsFlags paramete
1dcc0 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
1dcd0 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c  o pass to the fl
1dce0 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  ags parameter.**
1dcf0 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20   of the xOpen() 
1dd00 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75  method of the su
1dd10 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20  pplied VFS when 
1dd20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a  opening files. .
1dd30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
1dd40 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  er object is all
1dd50 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73  ocated and the s
1dd60 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70  pecified file op
1dd70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73  ened .** success
1dd80 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b  fully, SQLITE_OK
1dd90 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1dda0 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f   *ppPager set to
1ddb0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
1ddc0 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63   new pager objec
1ddd0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1dde0 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20  ccurs, *ppPager 
1ddf0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1de00 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65  * and error code
1de10 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
1de20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
1de30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1de40 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c  .** (sqlite3Mall
1de50 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  oc() is used to 
1de60 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29  allocate memory)
1de70 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
1de80 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73  N or .** various
1de90 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65   SQLITE_IO_XXX e
1dea0 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
1deb0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
1dec0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1ded0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
1dee0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
1def0 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
1df00 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
1df10 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r,         /* OU
1df20 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  T: Return the Pa
1df30 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
1df40 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
1df50 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
1df60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1df70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1df80 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
1df90 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
1dfa0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
1dfb0 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
1dfc0 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
1dfd0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dff0 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
1e000 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
1e010 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c  .  int vfsFlags,
1e020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e030 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
1e040 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
1e050 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
1e060 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
1e070 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63  DbPage*) /* Func
1e080 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61  tion to reinitia
1e090 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b  lize pages */.){
1e0a0 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
1e0b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
1e0c0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72  ;       /* Pager
1e0d0 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63   object to alloc
1e0e0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  ate and return *
1e0f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e100 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
1e110 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e120 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
1e130 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
1e140 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73  e for temp files
1e150 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72   (incl. in-memor
1e160 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e  y files) */.  in
1e170 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20  t memDb = 0;    
1e180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e190 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
1e1a0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
1e1b0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
1e1c0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
1e1d0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  e if this is a r
1e1e0 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f  ead-only file */
1e1f0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
1e200 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42  leSize;     /* B
1e210 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
1e220 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
1e230 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  l fd */.  char *
1e240 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  zPathname = 0;  
1e250 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20     /* Full path 
1e260 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e270 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   */.  int nPathn
1e280 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
1e290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1e2a0 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a  s in zPathname *
1e2b0 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
1e2c0 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
1e2d0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
1e2e0 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74  )==0; /* False t
1e2f0 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a  o omit journal *
1e300 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  /.  int noReadlo
1e310 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
1e320 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
1e330 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  !=0;  /* True to
1e340 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20   omit read-lock 
1e350 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
1e360 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
1e370 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
1e380 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
1e390 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
1e3a0 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65   */.  u16 szPage
1e3b0 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
1e3c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
1e3d0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
1e3e0 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e size */..  /* 
1e3f0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1e400 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
1e410 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
1e420 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
1e430 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
1e440 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
1e450 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1e460 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
1e470 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
1e480 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1e490 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
1e4a0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
1e4b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1e4c0 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
1e4d0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
1e4e0 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
1e4f0 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
1e500 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
1e510 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
1e520 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
1e530 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
1e540 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
1e550 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
1e560 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
1e570 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
1e580 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
1e590 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
1e5a0 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
1e5b0 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
1e5c0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1e5d0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1e5e0 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
1e5f0 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
1e600 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1e610 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1e620 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e630 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
1e640 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e650 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e660 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
1e670 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
1e680 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
1e690 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
1e6a0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
1e6b0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
1e6c0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
1e6d0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
1e6e0 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
1e6f0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
1e700 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
1e710 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
1e720 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
1e730 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
1e740 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
1e750 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
1e760 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
1e770 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
1e780 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
1e790 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
1e7a0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
1e7b0 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68  [0] ){.    nPath
1e7c0 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
1e7d0 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
1e7e0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
1e7f0 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  e3Malloc(nPathna
1e800 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
1e810 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
1e820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1e840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e850 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
1e860 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1e870 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
1e880 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
1e890 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
1e8a0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1e8b0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
1e8c0 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50  f.    {.      zP
1e8d0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
1e8e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
1e8f0 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
1e900 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
1e910 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72  fails */.      r
1e920 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
1e930 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
1e940 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
1e950 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
1e960 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61  ;.    }..    nPa
1e970 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1e980 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
1e990 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  me);.    if( rc=
1e9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
1e9b0 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
1e9c0 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
1e9d0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
1e9e0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
1e9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
1ea00 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
1ea10 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
1ea20 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
1ea30 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
1ea40 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
1ea50 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
1ea60 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
1ea70 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
1ea80 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
1ea90 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
1eaa0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
1eab0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
1eac0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1ead0 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
1eae0 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
1eaf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
1eb00 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
1eb10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
1eb20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
1eb30 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  N;.    }.    if(
1eb40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1eb50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1eb60 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1eb70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1eb80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1eb90 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
1eba0 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
1ebb0 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
1ebc0 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
1ebd0 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
1ebe0 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
1ebf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1ec00 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
1ec10 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
1ec20 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
1ec30 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
1ec40 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1ec50 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
1ec60 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ec70 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
1ec80 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
1ec90 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
1eca0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ecb0 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
1ecc0 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
1ecd0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1ece0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
1ecf0 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
1ed00 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
1ed10 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
1ed20 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1ed30 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
1ed40 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1ed50 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
1ed60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1ed70 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
1ed80 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1ed90 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
1eda0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
1edb0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1edc0 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
1edd0 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
1ede0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
1edf0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1ee00 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
1ee10 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
1ee20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1ee30 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
1ee40 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1ee50 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
1ee60 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1ee70 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
1ee80 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
1ee90 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
1eea0 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
1eeb0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
1eec0 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
1eed0 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
1eee0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1eef0 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
1ef00 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
1ef10 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
1ef20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
1ef30 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
1ef40 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
1ef50 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
1ef60 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
1ef70 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
1ef80 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   */.  );.  asser
1ef90 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1efa0 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
1efb0 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
1efc0 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
1efd0 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
1efe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1eff0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
1f000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1f010 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
1f020 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
1f030 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
1f040 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
1f050 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
1f060 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f070 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1f080 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
1f090 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
1f0a0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f0b0 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
1f0c0 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
1f0d0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
1f0e0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f0f0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1f100 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
1f110 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
1f120 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
1f130 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
1f140 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f150 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
1f160 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
1f170 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
1f180 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f190 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
1f1a0 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
1f1b0 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
1f1c0 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
1f1d0 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
1f1e0 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
1f1f0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
1f200 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61  hname ){.    pPa
1f210 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
1f220 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
1f230 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29  = nPathname + 1)
1f240 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
1f250 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f260 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
1f270 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
1f280 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
1f290 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
1f2a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
1f2b0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
1f2c0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
1f2d0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
1f2e0 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  8);.    if( pPag
1f2f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
1f300 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a  ==0 ) pPager->zJ
1f310 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20  ournal[0] = 0;. 
1f320 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f330 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
1f340 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
1f350 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
1f360 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
1f370 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
1f380 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1f390 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
1f3a0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
1f3b0 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
1f3c0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
1f3d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f3e0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
1f3f0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1f400 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
1f410 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1f420 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1f430 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
1f440 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
1f450 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
1f460 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
1f470 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1f480 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
1f490 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
1f4a0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
1f4b0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
1f4c0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
1f4d0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
1f4e0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
1f4f0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
1f500 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
1f510 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1f520 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
1f530 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
1f540 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
1f550 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
1f560 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1f570 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
1f580 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
1f590 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1f5a0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1f5b0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
1f5c0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
1f5d0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
1f5e0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
1f5f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1f600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1f610 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1f620 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1f630 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
1f640 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
1f650 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1f660 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f670 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
1f680 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
1f690 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
1f6a0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
1f6b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
1f6c0 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
1f6d0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f6e0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
1f6f0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f700 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f710 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
1f720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f730 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f740 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
1f750 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1f760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1f770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f780 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1f790 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1f7a0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1f7b0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1f7c0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1f7d0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
1f7e0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
1f7f0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
1f800 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
1f810 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
1f820 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
1f830 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
1f840 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
1f850 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f860 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f870 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
1f880 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
1f890 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
1f8a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1f8b0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
1f8c0 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
1f8d0 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
1f8e0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
1f8f0 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
1f900 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1f910 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
1f920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f930 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1f940 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1f950 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
1f960 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
1f970 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
1f980 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
1f990 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
1f9a0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
1f9b0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
1f9c0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
1f9d0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
1f9e0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
1f9f0 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
1fa00 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
1fa10 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
1fa20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
1fa30 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
1fa40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1fa50 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
1fa60 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
1fa70 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
1fa80 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
1fa90 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
1faa0 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
1fab0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
1fac0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
1fad0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1fae0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
1faf0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
1fb00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1fb10 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1fb20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
1fb30 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
1fb40 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
1fb50 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1fb60 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
1fb70 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1fb80 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
1fb90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
1fba0 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
1fbb0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
1fbc0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
1fbd0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
1fbe0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1fbf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1fc00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
1fc10 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
1fc20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1fc30 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
1fc40 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
1fc50 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
1fc60 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1fc70 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
1fc80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
1fc90 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
1fca0 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
1fcb0 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
1fcc0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1fcd0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
1fce0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1fcf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fd00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1fd10 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
1fd20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
1fd30 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1fd40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1fd50 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
1fd60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fd70 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1fd80 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
1fd90 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
1fda0 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
1fdb0 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
1fdc0 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
1fdd0 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
1fde0 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
1fdf0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1fe10 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
1fe20 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
1fe30 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
1fe40 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
1fe50 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
1fe60 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
1fe70 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
1fe80 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1fe90 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
1fea0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
1feb0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1fec0 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
1fed0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1fee0 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
1fef0 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
1ff00 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
1ff10 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
1ff20 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
1ff30 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1ff40 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
1ff50 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1ff60 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
1ff70 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
1ff80 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1ff90 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d  eValid = (u8)mem
1ffa0 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  Db;.  /* pPager-
1ffb0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
1ffc0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
1ffd0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
1ffe0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
1fff0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
20000 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
20010 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
20020 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
20030 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20040 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
20050 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20060 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
20070 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
20080 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
20090 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
200a0 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
200b0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
200c0 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
200d0 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
200e0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
200f0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
20100 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
20110 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
20120 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
20130 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
20140 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
20150 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
20160 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
20170 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
20180 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
20190 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
201a0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
201b0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
201c0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
201d0 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
201e0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
201f0 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  u8)readOnly;.  /
20200 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
20210 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73  nc = 0; */.  ass
20220 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
20230 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
20240 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
20250 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
20260 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
20270 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
20280 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20290 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
202a0 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
202b0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
202c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
202d0 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
202e0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
202f0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
20300 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
20310 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
20320 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
20330 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
20340 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
20350 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
20360 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
20370 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
20380 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20390 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
203a0 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
203b0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
203c0 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
203d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
203e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
203f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20400 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
20410 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
20420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20430 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
20440 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
20450 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
20460 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
20470 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20480 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
20490 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
204a0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
204b0 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
204c0 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
204d0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
204e0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
204f0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
20500 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
20510 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
20520 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20530 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
20540 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
20550 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
20560 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
20570 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
20580 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
20590 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
205a0 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
205b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
205c0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
205d0 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
205e0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
205f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
20600 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
20610 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
20620 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
20630 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
20640 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
20650 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
20660 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
20670 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
20680 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
20690 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
206a0 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
206b0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
206c0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
206d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
206e0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
206f0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
20700 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
20710 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
20720 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
20730 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
20740 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
20750 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
20760 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
20770 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
20780 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
20790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
207a0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
207b0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
207c0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
207d0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
207e0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
207f0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
20800 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
20810 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
20820 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
20830 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
20840 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
20850 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
20860 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
20870 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
20880 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
20890 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
208a0 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
208b0 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
208c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
208d0 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
208e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
208f0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
20900 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
20910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
20920 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
20930 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
20940 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
20950 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
20960 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
20970 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
20980 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
20990 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
209a0 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
209b0 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
209c0 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
209d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
209e0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
209f0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
20a00 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
20a10 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
20a20 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
20a30 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
20a40 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
20a50 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
20a60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
20a70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
20a80 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
20a90 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
20aa0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
20ab0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
20ac0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
20ad0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
20ae0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
20af0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
20b00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
20b10 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
20b20 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
20b30 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20b40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
20b50 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
20b60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20b70 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
20b80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
20b90 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
20ba0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
20bb0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
20bc0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
20bd0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
20be0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20bf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
20c00 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20   exists;        
20c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20c20 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
20c30 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
20c40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
20c50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
20c60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
20c70 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
20c80 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
20c90 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
20ca0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
20cb0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
20cc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20cd0 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
20ce0 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69  ARED );..  *pExi
20cf0 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  sts = 0;.  rc = 
20d00 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
20d10 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
20d20 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
20d30 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
20d40 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63  xists);.  if( rc
20d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
20d60 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
20d70 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
20d80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20d90 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
20da0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
20db0 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
20dc0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
20dd0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
20de0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
20df0 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
20e00 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
20e10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
20e20 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
20e30 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
20e40 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
20e50 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
20e60 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
20e70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
20e80 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
20e90 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
20ea0 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
20eb0 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
20ec0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20ed0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
20ee0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
20ef0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
20f00 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
20f10 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
20f20 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
20f30 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
20f40 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
20f50 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
20f60 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
20f70 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
20f80 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
20f90 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
20fa0 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
20fb0 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
20fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
20fd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
20fe0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
20ff0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
21000 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
21010 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
21020 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  t nPage;..      
21030 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
21040 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21050 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
21060 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
21070 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
21080 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
21090 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
210a0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
210b0 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
210c0 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
210d0 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
210e0 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
210f0 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
21100 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
21110 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
21120 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
21130 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
21140 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
21150 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
21160 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
21170 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21180 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
21190 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
211a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
211b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
211c0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
211d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
211e0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
211f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
21200 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
21210 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
21220 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
21230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21240 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
21250 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
21260 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
21270 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21280 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
21290 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
212a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
212b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
212c0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
212d0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
212e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
212f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
21300 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
21310 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
21320 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
21330 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
21340 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
21350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21360 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
21370 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
21380 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
21390 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
213a0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
213b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
213c0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
213d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
213e0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
213f0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
21400 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
21410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
21420 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
21430 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
21440 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
21450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
21460 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
21470 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
21480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21490 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
214a0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
214b0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
214c0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
214d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
214e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
214f0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
21500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
21510 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
21520 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
21530 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
21540 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21560 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
21570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21590 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
215a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
215b0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
215c0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
215d0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
215e0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
215f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21600 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
21610 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
21620 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
21630 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
21640 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
21650 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
21660 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
21670 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
21680 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
21690 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
216a0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
216b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
216c0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
216d0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
216e0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
216f0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
21700 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
21710 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
21720 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
21730 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
21740 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
21750 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
21760 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
21770 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
21780 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
21790 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
217a0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
217b0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
217c0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
217d0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
217e0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
217f0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
21800 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
21810 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
21820 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
21830 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
21840 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
21850 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
21860 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
21870 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
21880 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21890 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
218a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
218b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
218c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
218d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
218e0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
218f0 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
21900 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
21910 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
21920 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
21930 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
21940 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
21950 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
21960 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
21970 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
21980 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
21990 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
219a0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
219b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
219c0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
219d0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
219e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
219f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
21a00 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
21a10 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
21a20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
21a30 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
21a40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
21a50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21a60 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
21a70 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
21a80 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
21a90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
21aa0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
21ab0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
21ac0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
21ad0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
21ae0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
21af0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
21b00 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
21b10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
21b40 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b60 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
21b70 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66  f file to read f
21b80 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rom */..  assert
21b90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
21ba0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26 26  =PAGER_SHARED &&
21bb0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
21bc0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
21bd0 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
21be0 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28  ( NEVER(!isOpen(
21bf0 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
21c00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21c10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
21c20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
21c30 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
21c40 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21c60 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65 74  K;.  }.  iOffset
21c70 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
21c80 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
21c90 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
21ca0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
21cb0 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
21cc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21cd0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66  , iOffset);.  if
21ce0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21cf0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21d00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21d10 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
21d20 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38  gno==1 ){.    u8
21d30 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
21d40 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
21d50 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  )[24];.    memcp
21d60 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
21d70 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
21d80 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
21d90 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
21da0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
21db0 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
21dc0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
21dd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
21de0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
21df0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
21e00 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
21e10 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
21e20 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
21e30 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
21e40 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
21e50 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
21e60 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
21e70 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
21e90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
21ea0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
21eb0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
21ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21ed0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21ee0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
21ef0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
21f00 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21f10 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
21f20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
21f30 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
21f40 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
21f50 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
21f60 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
21f70 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
21f80 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
21f90 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
21fa0 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
21fb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21fc0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
21fd0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
21fe0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
21ff0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
22000 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
22010 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
22020 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
22030 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
22040 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
22050 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
22060 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
22070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
22080 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
22090 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
220a0 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
220b0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
220c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
220d0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
220e0 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
220f0 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
22100 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
22110 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
22120 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
22130 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
22140 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
22150 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
22160 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
22170 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
22180 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
22190 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
221a0 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
221b0 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
221c0 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
221d0 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
221e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
221f0 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
22200 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
22210 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
22220 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
22230 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
22240 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
22250 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
22260 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
22270 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
22280 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
22290 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
222a0 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
222b0 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
222c0 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
222d0 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
222e0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
222f0 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
22300 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
22310 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
22320 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22330 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
22340 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
22350 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
22360 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
22370 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
22380 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29  described by (2)
22390 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74   above is not at
223a0 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20  tempted, and if 
223b0 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20  the.** pager is 
223c0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
223d0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
223e0 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68  ITE_FULL when th
223f0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  is is called,.**
22400 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
22410 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
22420 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70  eturned. It is p
22430 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64  ermitted to read
22440 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
22450 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f   when in SQLITE_
22460 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65  FULL error state
22470 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
22480 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
22490 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
224a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
224b0 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
224c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
224d0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
224e0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
224f0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
22500 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f  ournal.** file o
22510 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
22520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
22530 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
22540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
22550 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22560 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
22570 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
22580 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
225a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
225b0 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72  */.  int isError
225c0 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  Reset = 0;      
225d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
225e0 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72  if recovering fr
225f0 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  om error state *
22600 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
22610 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
22620 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
22630 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
22640 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
22650 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
22660 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  s */.  assert( s
22670 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
22680 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
22690 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ache)==0 );.  if
226a0 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
226b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
226c0 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
226d0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
226e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
226f0 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65  abase is in an e
22700 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
22710 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63  is a chance to c
22720 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72  lear.  ** the er
22730 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
22740 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22750 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
22760 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61   rollback.  ** a
22770 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69  ny hot journal i
22780 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
22790 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  m..  */.  if( pP
227a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
227b0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
227c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
227d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
227e0 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f   ){.      isErro
227f0 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20  rReset = 1;.    
22800 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
22810 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
22820 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  K;.    pager_res
22830 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
22840 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
22850 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
22860 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
22870 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
22880 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
22890 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
228a0 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74  s;.    int isHot
228b0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
228c0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
228d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
228e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
228f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
22900 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
22910 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  if( pPager->noRe
22920 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
22930 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22940 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20  readOnly );.    
22950 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
22960 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
22970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22980 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
22990 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
229a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
229b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
229c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
229d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
229e0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
229f0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  NLOCK );.       
22a00 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
22a10 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
22a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22a30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22a40 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
22a50 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  _LOCK );..    /*
22a60 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
22a70 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
22a80 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
22a90 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
22aa0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22ab0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
22ac0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
22ad0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
22ae0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
22af0 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
22b00 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61  Reset ){.      a
22b10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22b20 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
22b30 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63  ARED );.      rc
22b40 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
22b50 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
22b60 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
22b70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22b80 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
22b90 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
22ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
22bb0 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
22bc0 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
22bd0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
22be0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
22bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22c00 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
22c10 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
22c20 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
22c30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
22c40 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
22c50 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
22c60 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
22c70 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
22c80 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
22c90 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
22ca0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
22cb0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
22cc0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
22cd0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
22ce0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
22cf0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22d00 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
22d10 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
22d20 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
22d30 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
22d40 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
22d50 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
22d60 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
22d70 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
22d80 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
22d90 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
22da0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
22db0 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
22dc0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
22dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22de0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
22df0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
22e00 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
22e10 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
22e20 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
22e30 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
22e40 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
22e50 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
22e60 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
22e70 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
22e80 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
22e90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22ea0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
22eb0 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
22ec0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
22ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22ee0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22ef0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
22f00 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
22f10 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
22f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
22f40 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
22f50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  E;.      }. .   
22f60 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
22f70 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
22f80 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
22f90 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
22fa0 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75   .      ** exclu
22fb0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
22fc0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
22fd0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
22fe0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
22ff0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
23000 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
23010 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
23020 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
23030 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  he.      ** OsTr
23040 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
23050 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
23060 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
23070 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
23080 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
23090 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
230a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
230b0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
230c0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
230d0 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
230e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
230f0 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65  ccess(pVfs,pPage
23100 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49  r->zJournal,SQLI
23110 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
23120 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20  ,&res);.        
23130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
23150 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
23160 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
23170 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23180 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
23190 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
231a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
231b0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
231c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
231d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
231e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
231f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
23200 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
23210 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
23220 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
23230 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
23240 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
23250 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
23260 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
23270 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
23290 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
232a0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
232b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
232c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
232d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
232e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
232f0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
23300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23320 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
23330 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
23340 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
23350 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
23360 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
23370 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
23380 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
23390 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
233a0 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
233b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
233c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
233d0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
233e0 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
233f0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
23400 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
23410 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
23420 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
23430 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
23440 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
23450 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
23460 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
23470 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
23480 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
23490 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
234a0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
234b0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
234c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
234d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
234e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
234f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
23500 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
23510 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
23520 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73  DO: Why are thes
23530 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20  e cleared here? 
23540 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f  Is it necessary?
23550 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
23560 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
23570 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
23580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
23590 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
235a0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
235b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
235c0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
235d0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
235e0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
235f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
23600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
23610 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
23620 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
23630 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
23640 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
23650 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
23660 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
23670 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
23680 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
23690 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
236a0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
236b0 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  t cache..      *
236c0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
236d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
236e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
236f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
23700 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
23710 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23730 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
23740 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
23750 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
23760 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
23770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23780 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
23790 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
237a0 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20  RED).           
237b0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
237c0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
237d0 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
237e0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29  _SHARED).      )
237f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23800 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
23810 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
23820 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
23830 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
23840 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
23850 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
23860 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
23870 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23880 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
23890 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
238a0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
238b0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
238c0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
238d0 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
238e0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
238f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
23900 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
23910 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
23920 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
23930 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
23940 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
23950 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
23960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
23970 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
23980 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
23990 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
239a0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
239b0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
239c0 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
239d0 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
239e0 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
239f0 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
23a00 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
23a10 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
23a20 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
23a30 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
23a40 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
23a50 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
23a60 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
23a70 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
23a80 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
23a90 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
23aa0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
23ab0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
23ac0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
23ad0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
23ae0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
23af0 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
23b00 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
23b10 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
23b20 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
23b30 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
23b40 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
23b50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23b60 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
23b70 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
23b80 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
23b90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
23ba0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
23bb0 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   0);..      if( 
23bc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
23bd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23be0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
23bf0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
23c00 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
23c10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
23c20 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
23c30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
23c40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
23c50 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
23c60 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
23c70 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
23c80 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
23c90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
23ca0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
23cb0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
23cc0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
23cd0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
23ce0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23d00 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23d10 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
23d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23d30 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
23d40 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
23d50 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
23d60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
23d70 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
23d80 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
23d90 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
23da0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
23db0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
23dc0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
23dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23df0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
23e00 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  | pPager->state=
23e10 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
23e20 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
23e30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23e40 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
23e50 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
23e60 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
23e70 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
23e80 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
23e90 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
23ea0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
23eb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
23ed0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
23ee0 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
23ef0 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
23f00 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
23f10 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
23f20 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
23f30 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
23f40 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
23f50 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
23f60 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
23f70 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
23f80 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
23f90 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
23fa0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
23fb0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
23fc0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
23fd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
23fe0 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
23ff0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
24000 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
24010 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
24020 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
24030 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
24040 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26  PCache)==0).   &
24050 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
24060 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
24070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
24080 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67  0) .  ){.    pag
24090 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
240a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
240b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
240c0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
240d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
240e0 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
240f0 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
24100 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
24110 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
24120 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
24130 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
24140 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
24150 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
24160 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
24170 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24180 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
24190 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
241a0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
241b0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
241c0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
241d0 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
241e0 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
241f0 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
24200 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
24210 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
24220 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
24230 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
24240 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
24250 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
24260 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
24270 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
24280 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
24290 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
242a0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
242b0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
242c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
242d0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
242e0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
242f0 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
24300 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
24310 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
24320 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
24330 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
24340 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
24350 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
24360 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
24370 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24380 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
24390 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
243a0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
243b0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
243c0 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
243d0 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
243e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
243f0 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
24400 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
24410 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
24420 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
24430 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
24440 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
24450 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
24460 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
24470 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
24480 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
24490 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
244a0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
244b0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
244c0 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
244d0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
244e0 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
244f0 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
24500 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
24510 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
24520 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
24530 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24540 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
24550 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
24560 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
24570 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
24580 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
24590 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
245a0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
245b0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
245c0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
245d0 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
245e0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
245f0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
24600 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
24610 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
24620 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
24630 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74  cache to populat
24640 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  e with the data 
24650 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
24660 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
24670 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
24680 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
24690 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
246a0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
246b0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
246c0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
246d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
246e0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
246f0 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
24700 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
24710 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
24720 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
24730 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
24740 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
24750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
24760 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
24770 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
24780 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
24790 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
247a0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
247b0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
247c0 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
247d0 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
247e0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
247f0 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
24800 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
24810 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
24820 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
24830 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
24840 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
24850 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
24860 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
24870 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
24880 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
24890 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
248a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
248b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
248c0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
248d0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
248e0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
248f0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
24900 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
24910 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
24920 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
24930 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
24940 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
24950 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
24960 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
24970 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
24980 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
24990 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
249a0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
249b0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
249c0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
249d0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
249e0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
249f0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
24a00 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
24a10 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
24a20 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
24a30 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
24a40 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
24a50 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
24a60 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
24a70 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
24a80 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
24a90 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
24aa0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
24ab0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
24ac0 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
24ad0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
24ae0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
24af0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24b00 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
24b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
24b20 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
24b30 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
24b40 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
24b50 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
24b60 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
24b70 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
24b80 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
24b90 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
24ba0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
24bb0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
24bc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
24bd0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
24be0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
24bf0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
24c00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24c10 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
24c20 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  UNLOCK );..  if(
24c30 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
24c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24c50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
24c60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
24c70 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
24c80 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
24c90 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
24ca0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
24cb0 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
24cc0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
24cd0 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
24ce0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
24cf0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
24d00 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
24d10 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
24d20 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
24d30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
24d40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24d50 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
24d60 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
24d70 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
24d80 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ppPage);.  }..  
24d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24da0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
24db0 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
24dc0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
24dd0 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
24de0 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
24df0 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
24e00 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
24e10 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
24e20 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
24e30 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
24e40 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
24e50 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
24e60 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
24e70 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
24e80 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
24e90 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
24ea0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
24eb0 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
24ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
24ed0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
24ee0 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
24ef0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
24f00 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
24f10 65 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  e)->pPager ){.  
24f20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
24f30 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
24f40 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
24f50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
24f60 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
24f70 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
24f80 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
24f90 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
24fa0 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
24fb0 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
24fc0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
24fd0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47  ager) );.    PAG
24fe0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
24ff0 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72  nHit);.    retur
25000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
25010 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
25020 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
25030 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
25040 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
25050 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
25060 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
25070 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  d.  */.    int n
25080 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f  Max;..    PAGER_
25090 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
250a0 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a  ss);.    pPg = *
250b0 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
250c0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
250d0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
250e0 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
250f0 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
25100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25110 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
25120 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
25130 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
25140 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
25150 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
25160 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
25170 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
25180 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
25190 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
251a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
251b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
251c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
251d0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
251e0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
251f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25200 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
25210 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69  r, &nMax);.    i
25220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25230 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
25240 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25250 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25260 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
25270 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f  || MEMDB || noCo
25280 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69  ntent ){.      i
25290 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
252a0 6d 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20  mxPgno ){..rc = 
252b0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f  SQLITE_FULL;..go
252c0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
252d0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
252e0 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
252f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
25300 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
25310 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
25320 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
25330 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
25340 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
25350 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
25360 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
25370 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
25380 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
25390 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
253a0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
253b0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
253c0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
253d0 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
253e0 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
253f0 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
25400 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
25410 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
25420 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
25430 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
25440 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
25450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
25460 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
25470 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
25480 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
25490 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
254a0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
254b0 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
254c0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
254d0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
254e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
254f0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
25500 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
25510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
25520 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
25530 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
25540 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
25550 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
25560 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
25570 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
25580 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
25590 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
255a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
255b0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
255c0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
255d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
255e0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
255f0 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
25600 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
25610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25620 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
25630 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
25640 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
25650 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
25660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25670 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
25680 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
25690 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
256a0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
256b0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
256c0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
256d0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
256e0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
256f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
25700 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
25710 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
25720 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
25730 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
25740 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
25750 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
25760 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
25770 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
25780 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
25790 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
257a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
257b0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
257c0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
257d0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
257e0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
257f0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
25800 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
25810 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
25820 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
25830 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
25840 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
25850 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
25860 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
25870 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
25880 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
25890 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
258a0 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
258b0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
258c0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
258d0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
258e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
258f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
25900 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
25910 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
25920 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
25930 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
25940 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
25950 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
25960 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
25970 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
25980 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
25990 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
259a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
259b0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
259c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
259d0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
259e0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
259f0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
25a00 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
25a10 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
25a20 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
25a30 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
25a40 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
25a50 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
25a60 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
25a70 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
25a80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25a90 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
25aa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25ab0 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
25ac0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
25ad0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
25ae0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25af0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
25b00 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
25b10 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
25b20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
25b30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
25b40 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
25b50 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
25b60 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
25b70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
25b80 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
25b90 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
25ba0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
25bb0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
25bc0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
25bd0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
25be0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
25bf0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
25c00 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
25c10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25c20 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
25c30 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
25c40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
25c50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
25c60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
25c70 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
25c80 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
25c90 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
25ca0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
25cb0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
25cc0 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ile has already 
25cd0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73  been opened, ens
25ce0 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ure that the.** 
25cf0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
25d00 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66   is open too. If
25d10 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
25d20 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a  l is not open,.*
25d30 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
25d40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
25d50 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
25d60 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
25d70 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
25d80 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a  ding to plan. .*
25d90 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  * An SQLITE_IOER
25da0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
25db0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
25dc0 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  a call to .** sq
25dd0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
25de0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
25df0 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
25e00 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
25e10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25e20 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73  ITE_OK;.  if( is
25e30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25e40 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
25e50 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
25e60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
25e70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
25e80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
25e90 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
25ea0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
25eb0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
25ec0 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
25ed0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
25ee0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
25ef0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
25f00 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
25f10 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
25f20 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
25f30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25f40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
25f50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25f60 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
25f70 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
25f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
25f90 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
25fa0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
25fb0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
25fc0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
25fd0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
25fe0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25ff0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
26000 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
26010 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
26020 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
26030 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
26040 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
26050 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
26060 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
26070 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
26080 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
26090 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
260a0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
260b0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
260c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
260d0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
260e0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
260f0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
26100 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
26110 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
26120 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
26130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
26140 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
26150 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
26160 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
26170 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
26180 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
26190 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
261a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
261b0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
261c0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
261d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
261e0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
261f0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
26200 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
26210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26220 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
26230 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
26240 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
26250 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
26260 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
26270 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26280 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
26290 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
262a0 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
262b0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
262c0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
262d0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
262e0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
262f0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
26300 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
26310 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
26320 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
26330 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
26340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26350 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
26360 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
26370 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26380 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
263b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
263c0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
263d0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
263e0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
263f0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
26400 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26410 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
26420 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
26430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
26440 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
26450 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26460 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
26470 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
26480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26490 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
264a0 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
264b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
264c0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
264d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
264e0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
264f0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
26500 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
26510 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
26520 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
26530 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
26540 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
26550 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
26560 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
26570 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26580 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  ode;..  /* TODO:
26590 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f   Is it really po
265a0 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65  ssible to get he
265b0 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61  re with dbSizeVa
265c0 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a  lid==0? If not,.
265d0 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f    ** the call to
265e0 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   PagerPagecount(
265f0 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  ) can be removed
26600 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
26610 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
26620 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73  eValid==0 );.  s
26630 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
26640 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
26650 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ..  pPager->pInJ
26660 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
26670 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
26680 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
26690 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
266a0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
266b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
266c0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
266d0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
266e0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
266f0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
26700 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
26710 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26720 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
26730 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
26740 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26750 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
26760 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
26770 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
26780 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
26790 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
267a0 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
267b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
267c0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
267d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
267e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
267f0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
26800 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
26810 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
26820 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
26830 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26840 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
26850 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
26860 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
26870 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26880 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26890 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69  L).        );.#i
268a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
268b0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
268c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
268d0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
268e0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
268f0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26900 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
26910 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
26920 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
26930 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
26940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
26950 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
26960 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
26970 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
26980 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
26990 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
269a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
269b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
269c0 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ) );.  }...  /* 
269d0 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
269e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
269f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26a00 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a  le and open .  *
26a10 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
26a20 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
26a30 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
26a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26a50 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
26a60 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
26a70 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
26a80 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ed. */.    pPage
26a90 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
26aa0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
26ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26ac0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
26ad0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
26ae0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
26af0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
26b00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26b10 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
26b20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
26b30 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
26b40 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26b50 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  0;.    rc = writ
26b60 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
26b70 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
26b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26b90 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
26ba0 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nt ){.    rc = o
26bb0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
26bc0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
26bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
26bf0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
26c00 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
26c10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
26c20 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
26c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26c40 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
26c50 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
26c60 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
26c70 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
26c80 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
26c90 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
26ca0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
26cb0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
26cc0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
26cd0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
26ce0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
26cf0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
26d00 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
26d10 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
26d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26d30 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
26d40 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
26d50 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
26d60 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
26d70 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
26d80 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
26d90 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
26da0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
26db0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
26dc0 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
26dd0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
26de0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
26df0 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
26e00 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
26e10 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
26e20 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
26e30 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
26e40 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
26e50 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
26e60 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
26e70 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
26e80 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
26e90 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
26ea0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
26eb0 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
26ec0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
26ed0 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
26ee0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
26ef0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
26f00 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
26f10 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
26f20 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
26f30 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
26f40 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
26f50 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
26f60 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
26f70 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
26f80 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
26f90 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
26fa0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
26fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
26fc0 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
26fd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
26fe0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
26ff0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
27000 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
27010 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
27020 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
27030 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
27040 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
27050 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
27060 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
27070 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
27080 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
27090 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
270a0 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
270b0 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
270c0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
270d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
270e0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
270f0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
27100 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
27110 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
27120 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
27130 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
27140 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
27150 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27160 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
27170 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
27180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
271a0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
271b0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67  UNLOCK );.  pPag
271c0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
271d0 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
271e0 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ory;.  if( pPage
271f0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
27200 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
27210 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
27220 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
27230 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
27240 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  B && !pPager->te
27250 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f  mpFile );..    /
27260 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
27270 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
27280 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27290 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
272a0 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73  ameter.    ** is
272b0 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
272c0 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
272d0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
272e0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
272f0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
27300 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
27310 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
27320 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
27330 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
27340 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
27350 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
27360 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
27370 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
27380 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
27390 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
273a0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
273b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
273c0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
273d0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
273e0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66  SERVED;.      if
273f0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
27400 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
27410 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
27420 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
27430 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
27440 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
27450 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
27460 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c   were successful
27470 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65  ly obtained, ope
27480 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27490 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72    ** file and wr
274a0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
274b0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20  urnal-header to 
274c0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
274d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
274e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
274f0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
27500 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
27510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27520 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
27530 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
27540 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
27550 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27560 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
27570 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
27580 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
27590 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
275a0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
275b0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c  ccess mode the l
275c0 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
275d0 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
275e0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
275f0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
27600 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
27610 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
27620 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
27630 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
27640 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
27650 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
27660 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73  n and either was
27670 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
27680 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61  bytes or its hea
27690 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f  der was.    ** o
276a0 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
276b0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
276c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
276d0 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
276e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
276f0 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
27700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27710 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27720 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
27730 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
27740 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
27750 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
27760 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
27770 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27780 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
27790 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
277a0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
277b0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
277c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
277d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
277e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
277f0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d  rt( !pPager->dbM
27800 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f  odified );.    /
27810 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20  * Ignore any IO 
27820 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
27830 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65  s within pager_e
27840 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  nd_transaction()
27850 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72  . The.    ** pur
27860 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
27870 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68  l is to reset th
27880 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
27890 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20   of the pager.  
278a0 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e    ** sub-system.
278b0 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74   It doesn't matt
278c0 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  er if the journa
278d0 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72  l-file is not pr
278e0 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69  operly.    ** fi
278f0 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20  nalized at this 
27900 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20  point (since it 
27910 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a  is not a valid j
27920 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77  ournal file anyw
27930 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ay)..    */.    
27940 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
27950 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
27960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
27980 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
27990 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
279a0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
279b0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
279c0 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
279d0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
279e0 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
279f0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
27a00 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
27a10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
27a20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
27a30 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
27a40 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
27a50 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
27a60 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
27a70 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
27a80 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
27a90 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
27aa0 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
27ab0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
27ac0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
27ad0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
27ae0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
27af0 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
27b00 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
27b10 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
27b20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
27b30 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
27b40 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
27b50 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
27b60 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
27b70 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65  been.  ** starte
27b80 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
27b90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
27ba0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
27bb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  );..  /* If an e
27bc0 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
27bd0 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65  eviously detecte
27be0 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f 74  d, we should not
27bf0 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e 67   be.  ** calling
27c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
27c10 52 65 70 65 61 74 20 74 68 65 20 65 72 72 6f 72  Repeat the error
27c20 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e   for robustness.
27c30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
27c40 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
27c50 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
27c60 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
27c70 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
27c80 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
27c90 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
27ca0 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
27cb0 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
27cc0 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
27cd0 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
27ce0 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
27cf0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
27d00 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
27d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
27d20 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  RM;..  assert( !
27d30 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
27d40 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
27d50 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
27d60 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
27d70 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
27d80 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
27d90 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
27da0 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
27db0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
27dc0 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
27dd0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
27de0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
27df0 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
27e00 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
27e10 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
27e20 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  e(pPg) ){.    pP
27e30 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
27e40 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
27e50 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
27e60 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
27e70 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
27e80 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
27e90 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
27ea0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
27eb0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
27ec0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
27ed0 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
27ee0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27ef0 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
27f00 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
27f10 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65  e already starte
27f20 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  d a transaction,
27f30 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65  .    ** which me
27f40 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63  ans they have ac
27f50 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73  quired the neces
27f60 73 61 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6f  sary locks and o
27f70 70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 61 20 72  pened.    ** a r
27f80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
27f90 20 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74    Double-check t
27fa0 6f 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 69  o makes sure thi
27fb0 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
27fc0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
27fd0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
27fe0 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67  (pPager, 0, pPag
27ff0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
28000 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
28010 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
28020 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28030 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
28040 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
28050 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
28060 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
28070 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28080 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61 73  _OFF ){.      as
28090 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
280a0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
280b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
280c0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
280d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
280e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
280f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28100 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
28110 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
28120 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
28130 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
28140 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
28150 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
28160 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
28170 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
28180 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
28190 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
281a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
281b0 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
281c0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
281d0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
281e0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
281f0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
28200 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
28210 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28220 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
28230 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
28240 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
28250 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
28260 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
28270 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
28280 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
28290 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
282a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
282b0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
282c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
282d0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
282e0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
282f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
28300 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
28310 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
28320 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
28330 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
28340 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
28350 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
28360 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
28370 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
28380 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
28390 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
283a0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
283b0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
283c0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
283d0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
283e0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
283f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28400 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
28410 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
28420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28450 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
28460 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
28470 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
284a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
284b0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
284c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
284d0 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
284e0 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
284f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28510 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
28520 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
28530 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
28540 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
28550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
28560 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
28570 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
28580 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28590 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
285a0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
285b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
285d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
285e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
285f0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
28600 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
28610 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
28620 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
28630 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
28640 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
28650 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
28660 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
28670 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
28680 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
28690 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
286a0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
286b0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
286c0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
286d0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
286e0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
286f0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
28700 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
28710 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
28720 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
28730 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
28740 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
28750 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
28760 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
28770 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
28780 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
28790 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
287a0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
287b0 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
287c0 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
287d0 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
287e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
287f0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
28800 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
28810 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28820 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
28830 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
28840 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
28850 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
28860 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
28870 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
28880 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
28890 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
288a0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
288b0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
288c0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
288d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
288e0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
288f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
28900 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
28910 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  rred writing to 
28920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28930 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
28940 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
28950 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
28960 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
28970 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
28980 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
289a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
289b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
289c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
289d0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
289e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
289f0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
28a00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28a10 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
28a20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
28a30 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
28a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28a50 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
28a60 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
28a70 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
28a80 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
28a90 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
28aa0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
28ab0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
28ac0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
28ad0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28af0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
28b00 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
28b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
28b20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28b30 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
28b40 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
28b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
28b60 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
28b70 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
28b80 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
28b90 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28bb0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
28bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28bd0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28be0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
28bf0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
28c00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28c10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
28c20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
28c40 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
28c50 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
28c60 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
28c70 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
28c80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
28c90 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
28ca0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
28cb0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
28cc0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
28cd0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
28ce0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
28cf0 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
28d00 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
28d10 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
28d20 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
28d30 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
28d40 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
28d50 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
28d60 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
28d70 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
28d80 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
28d90 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
28da0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
28db0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
28dc0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
28dd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
28de0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
28df0 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
28e00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
28e10 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
28e20 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
28e30 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
28e40 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
28e50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
28e60 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
28e70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
28e90 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
28ea0 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
28eb0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
28ec0 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
28ed0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
28ee0 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
28ef0 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
28f00 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
28f10 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
28f20 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
28f30 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
28f40 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
28f50 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
28f60 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
28f70 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
28f80 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
28f90 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
28fa0 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
28fb0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
28fc0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
28fd0 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
28fe0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
28ff0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
29000 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
29010 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
29020 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
29030 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
29040 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
29050 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
29060 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
29070 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
29080 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
29090 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
290a0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
290b0 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
290c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
290d0 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
290e0 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
290f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
29100 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
29110 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
29120 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
29130 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
29140 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
29150 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
29160 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
29170 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
29180 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
29190 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
291a0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
291b0 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65  e);..  if( nPage
291c0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
291d0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
291e0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
291f0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
29200 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
29210 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
29220 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
29230 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29240 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
29250 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
29260 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
29270 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
29280 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29290 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
292a0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
292b0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
292c0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
292d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
292e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
292f0 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
29300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29310 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
29320 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29330 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
29340 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
29350 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
29360 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
29370 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
29380 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
29390 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
293a0 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
293b0 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
293c0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
293d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
293e0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
293f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
29400 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
29410 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29420 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
29430 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
29440 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
29450 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
29460 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
29470 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
29480 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
29490 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
294a0 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
294b0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
294c0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
294d0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
294e0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
294f0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
29500 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
29510 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
29520 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73  -1)) + 1;..    s
29530 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29540 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e  ount(pPager, (in
29550 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29  t *)&nPageCount)
29560 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
29570 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
29580 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29590 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
295a0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
295b0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
295c0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
295d0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
295e0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
295f0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
29600 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
29610 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
29620 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
29630 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
29640 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
29650 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
29660 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
29670 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
29680 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
29690 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
296a0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
296b0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
296c0 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
296d0 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
296e0 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
296f0 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
29700 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
29710 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
29720 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
29730 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
29740 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
29750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29760 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
29770 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
29780 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
297a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
297b0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
297c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
297d0 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
297e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
297f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29800 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
29810 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
29820 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
29830 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
29840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29850 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29860 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29880 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29890 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
298a0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
298b0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
298c0 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
298d0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
298e0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
298f0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
29900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
29910 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29920 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
29930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
29940 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
29950 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
29960 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
29970 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
29980 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
29990 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
299a0 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
299b0 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
299c0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
299d0 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
299e0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
299f0 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
29a00 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
29a10 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
29a20 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
29a30 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
29a40 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
29a50 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
29a60 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
29a70 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
29a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29a90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
29aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29ab0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
29ac0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
29ad0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
29ae0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
29af0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
29b00 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
29b10 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
29b20 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
29b30 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
29b40 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
29b60 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
29b70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
29b80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29b90 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29ba0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29bb0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
29bc0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
29bd0 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
29be0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29bf0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
29c00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
29c10 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
29c20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
29c30 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
29c40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29c50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
29c60 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
29c70 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
29c80 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
29c90 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
29ca0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
29cb0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
29cc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
29cd0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
29ce0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
29cf0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
29d00 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
29d10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
29d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29d30 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
29d40 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
29d50 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
29d60 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
29d70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29d80 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2f  _SECURE_DELETE./
29d90 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
29da0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
29db0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
29dc0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
29dd0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
29de0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
29df0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
29e00 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
29e10 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
29e20 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
29e30 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
29e40 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
29e50 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
29e60 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
29e70 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
29e80 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
29e90 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
29ea0 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
29eb0 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
29ec0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
29ed0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
29ee0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
29ef0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
29f00 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
29f10 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
29f20 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
29f30 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
29f40 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
29f50 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
29f60 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
29f70 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
29f80 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
29f90 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
29fa0 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
29fb0 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
29fc0 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
29fd0 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
29fe0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
29ff0 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
2a000 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2a010 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2a020 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
2a030 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2a040 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
2a050 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
2a060 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a070 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
2a080 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
2a090 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
2a0a0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
2a0b0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
2a0c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2a0d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
2a0e0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
2a0f0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
2a100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2a110 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
2a120 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
2a130 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
2a140 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d  g);.#endif.  }.}
2a150 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2a160 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52  ned(SQLITE_SECUR
2a170 45 5f 44 45 4c 45 54 45 29 20 2a 2f 0a 0a 2f 2a  E_DELETE) */../*
2a180 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a190 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
2a1a0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2a1b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a1c0 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
2a1d0 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
2a1e0 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
2a1f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2a200 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
2a210 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2a220 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
2a230 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a240 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2a250 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
2a260 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
2a270 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
2a280 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2a290 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
2a2a0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
2a2b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
2a2c0 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
2a2d0 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
2a2e0 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
2a2f0 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
2a300 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2a310 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
2a320 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
2a330 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
2a340 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
2a350 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
2a360 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
2a370 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
2a380 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2a390 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
2a3a0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
2a3b0 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
2a3c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2a3d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a3e0 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
2a3f0 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
2a400 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
2a410 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
2a420 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
2a430 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
2a440 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
2a450 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2a460 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
2a470 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
2a480 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2a490 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
2a4a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a4b0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61  _OK;..  /* Decla
2a4c0 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  re and initializ
2a4d0 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  e constant integ
2a4e0 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49  er 'isDirect'. I
2a4f0 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69  f the.  ** atomi
2a500 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2a510 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
2a520 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74  in this build, t
2a530 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a  hen isDirect.  *
2a540 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
2a550 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
2a560 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69  ssed as the isDi
2a570 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74  rectMode paramet
2a580 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  er.  ** to this 
2a590 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
2a5a0 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ise, it is alway
2a5b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20  s set to zero.. 
2a5c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65   **.  ** The ide
2a5d0 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  a is that if the
2a5e0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2a5f0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
2a600 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61  t.  ** enabled a
2a610 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2a620 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e  the compiler can
2a630 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20   omit the tests 
2a640 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63  of.  ** 'isDirec
2a650 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c  t' below, as wel
2a660 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65  l as the block e
2a670 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20  nclosed in the. 
2a680 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63   ** "if( isDirec
2a690 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  t )" condition..
2a6a0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2a6b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2a6c0 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65  C_WRITE.# define
2a6d0 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20   DIRECT_MODE 0. 
2a6e0 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63   assert( isDirec
2a6f0 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e  tMode==0 );.  UN
2a700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2a710 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65  sDirectMode);.#e
2a720 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52  lse.# define DIR
2a730 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63  ECT_MODE isDirec
2a740 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20  tMode.#endif..  
2a750 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a760 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
2a770 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21  ERVED );.  if( !
2a780 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2a790 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65  untDone && pPage
2a7a0 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
2a7b0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
2a7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a7d0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
2a7e0 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75   page 1 */.    u
2a7f0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
2a800 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2a810 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
2a820 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2a830 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73  field */..    as
2a840 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2a850 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
2a860 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2a870 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
2a880 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
2a890 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
2a8a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a8b0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2a8c0 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
2a8d0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
2a8e0 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
2a8f0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
2a900 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
2a910 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
2a920 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
2a930 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
2a940 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
2a950 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
2a960 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
2a970 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
2a980 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
2a990 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
2a9a0 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
2a9b0 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
2a9c0 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
2a9d0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
2a9e0 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
2a9f0 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
2aa00 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
2aa10 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
2aa20 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
2aa30 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
2aa40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
2aa50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2aa60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
2aa70 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
2aa80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2aa90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2aaa0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2aab0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
2aac0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
2aad0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
2aae0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2aaf0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
2ab00 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
2ab10 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
2ab20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2ab30 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74  ter++;.      put
2ab40 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
2ab50 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34  PgHdr->pData)+24
2ab60 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
2ab70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2ab80 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
2ab90 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
2aba0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
2abb0 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
2abc0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44  . */.      if( D
2abd0 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20  IRECT_MODE ){.  
2abe0 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
2abf0 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
2ac00 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >pData;.        
2ac10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ac20 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
2ac30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2ac40 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2ac50 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
2ac60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2ac70 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2ac80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ac90 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2aca0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2acb0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
2acc0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2acd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2ace0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2acf0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2ad00 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
2ad10 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
2ad20 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
2ad30 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2ad40 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
2ad50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ad60 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
2ad70 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
2ad80 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
2ad90 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
2ada0 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
2adb0 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
2adc0 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
2add0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2ade0 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
2adf0 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
2ae00 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
2ae10 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
2ae20 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2ae30 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
2ae40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2ae50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2ae60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2ae70 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
2ae80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aeb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2aec0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2aed0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2aee0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2aef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2af00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2af10 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2af20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2af30 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2af40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2af50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2af60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2af70 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
2af80 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
2af90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
2afa0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
2afb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
2afc0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
2afd0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
2afe0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
2aff0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
2b000 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
2b010 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
2b020 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
2b030 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
2b040 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2b050 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
2b060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b070 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
2b080 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
2b090 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
2b0a0 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
2b0b0 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
2b0c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2b0d0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
2b0e0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2b0f0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
2b100 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
2b110 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
2b120 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2b130 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
2b140 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2b150 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
2b160 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
2b170 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
2b180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
2b190 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
2b1a0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
2b1b0 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
2b1c0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
2b1d0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
2b1e0 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
2b1f0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
2b200 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
2b210 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
2b220 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
2b230 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
2b240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
2b250 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
2b260 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
2b270 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
2b280 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
2b290 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
2b2a0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
2b2b0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
2b2c0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2b2d0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
2b2e0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
2b2f0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
2b300 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2b310 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b320 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
2b330 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
2b340 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
2b350 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2b360 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
2b370 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2b380 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
2b390 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
2b3a0 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
2b3b0 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
2b3c0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2b3d0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2b3e0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2b3f0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
2b400 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2b410 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2b420 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
2b430 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2b440 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2b450 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
2b460 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2b470 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
2b480 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
2b490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b4a0 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
2b4b0 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
2b4c0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2b4d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b4f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2b500 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69   /* The dbOrigSi
2b510 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  ze is never set 
2b520 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
2b530 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OFF */.  assert(
2b540 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b550 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2b560 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
2b570 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2b580 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  e==0 );..  /* If
2b590 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f   a prior error o
2b5a0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 72 6f  ccurred, this ro
2b5b0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
2b5c0 20 62 65 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c   be called.  ROL
2b5d0 4c 42 41 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68  LBACK.  ** is th
2b5e0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
2b5f0 73 70 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72 72  sponse to an err
2b600 6f 72 2c 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20  or, not COMMIT. 
2b610 20 47 75 61 72 64 20 61 67 61 69 6e 73 74 0a 20   Guard against. 
2b620 20 2a 2a 20 63 6f 64 69 6e 67 20 65 72 72 6f 72   ** coding error
2b630 73 20 62 79 20 72 65 70 65 61 74 69 6e 67 20 74  s by repeating t
2b640 68 65 20 70 72 69 6f 72 20 65 72 72 6f 72 2e 20  he prior error. 
2b650 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2b660 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2b670 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
2b680 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47  >errCode;..  PAG
2b690 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41  ERTRACE(("DATABA
2b6a0 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
2b6b0 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a   zMaster=%s nSiz
2b6c0 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  e=%d\n", .      
2b6d0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b6e0 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  e, zMaster, pPag
2b6f0 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20  er->dbSize));.. 
2b700 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50   if( MEMDB && pP
2b710 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2b720 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2b730 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2b740 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
2b750 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
2b760 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
2b770 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
2b780 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2b790 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
2b7a0 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
2b7b0 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
2b7c0 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
2b7d0 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
2b7e0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
2b7f0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2b800 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
2b810 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
2b820 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2b830 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
2b840 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61 67  R_SYNCED && pPag
2b850 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2b860 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  {..    /* The fo
2b870 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
2b880 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
2b890 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
2b8a0 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20  y how it.    ** 
2b8b0 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
2b8c0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
2b8d0 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
2b8e0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2b8f0 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  on.    ** was en
2b900 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2b910 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
2b920 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
2b930 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  eets the .    **
2b940 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
2b950 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
2b960 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a  ration: .    **.
2b970 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
2b980 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2b990 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
2b9a0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
2b9b0 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
2b9c0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
2b9d0 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20  ge-size, and .  
2b9e0 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
2b9f0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
2ba00 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
2ba10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
2ba20 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  nd.    **    * E
2ba30 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
2ba40 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2ba50 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
2ba60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2ba70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2ba80 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2ba90 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
2baa0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2bab0 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
2bac0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2bad0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
2bae0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2baf0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
2bb00 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f  change.    ** co
2bb10 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
2bb20 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
2bb30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2bb40 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
2bb50 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
2bb60 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
2bb70 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
2bb80 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
2bb90 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a  alCreate().    *
2bba0 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
2bbb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bbc0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
2bbd0 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  n created, then 
2bbe0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  call.    ** page
2bbf0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2bc00 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2bc10 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2bc20 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
2bc30 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
2bc40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
2bc50 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
2bc60 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
2bc70 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
2bc80 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a  pplicable,.    *
2bc90 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
2bca0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2bcb0 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2bcc0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2bcd0 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64  ter.    ** in 'd
2bce0 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
2bcf0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2bd00 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
2bd10 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20  never be.    ** 
2bd20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
2bd30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
2bd40 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2bd50 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2bd60 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48 64 72  _WRITE.    PgHdr
2bd70 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
2bd80 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2bd90 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
2bda0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2bdb0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bdc0 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20  _OFF );.    if( 
2bdd0 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70  !zMaster && isOp
2bde0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2bdf0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2be00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
2be10 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
2be20 65 72 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  er) .     && pPa
2be30 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
2be40 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  ger->dbFileSize.
2be50 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
2be60 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2be70 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2be80 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
2be90 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
2bea0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55     ){.      /* U
2beb0 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
2bec0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2bed0 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
2bee0 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
2bef0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  e .      ** foll
2bf00 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
2bf10 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
2bf20 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
2bf30 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
2bf40 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75       ** to inclu
2bf50 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63  de the updated c
2bf60 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
2bf70 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
2bf80 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69  e 1 .      ** di
2bf90 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
2bfa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63  tabase file. Bec
2bfb0 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
2bfc0 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20  ic-write .      
2bfd0 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
2bfe0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
2bff0 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
2c000 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2c010 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2c020 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2c030 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2c040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2c050 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2c060 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2c070 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2c080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c090 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2c0a0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2c0b0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2c0c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c0d0 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70  #else.    rc = p
2c0e0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2c0f0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2c100 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
2c110 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c120 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2c130 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2c140 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
2c150 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
2c160 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2c170 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
2c180 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ll pages.    ** 
2c190 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
2c1a0 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
2c1b0 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
2c1c0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2c1d0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68  .    ** file. Th
2c1e0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2c1f0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
2c200 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  m mode..    **. 
2c210 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
2c220 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
2c230 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2c240 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2c250 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
2c260 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
2c270 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
2c280 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
2c290 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  alue.    ** that
2c2a0 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
2c2b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
2c2c0 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
2c2d0 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ise, the.    ** 
2c2e0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2c2f0 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
2c300 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
2c310 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a  nstead of .    *
2c320 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66  * reading data f
2c330 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2c340 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
2c350 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61    ** When journa
2c360 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20  l_mode==OFF the 
2c370 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c  dbOrigSize is al
2c380 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68  ways zero, so th
2c390 69 73 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  is.    ** block 
2c3a0 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f  never runs if jo
2c3b0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a  urnal_mode=OFF..
2c3c0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2c3d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2c3e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2c3f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
2c400 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2c410 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28  .     && ALWAYS(
2c420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2c430 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2c440 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20  ALMODE_OFF).    
2c450 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  ){.      Pgno i;
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2c490 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
2c4a0 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69   const Pgno iSki
2c4b0 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
2c4c0 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65  O(pPager); /* Pe
2c4d0 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20  nding lock page 
2c4e0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2c4f0 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
2c500 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20  ger->dbSize;    
2c510 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
2c520 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20  mage size */ .  
2c530 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2c540 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
2c550 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  rigSize;.      f
2c560 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20  or( i=dbSize+1; 
2c570 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  i<=pPager->dbOri
2c580 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  gSize; i++ ){.  
2c590 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
2c5a0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
2c5b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2c5c0 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
2c5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
2c5e0 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  dr *pPage;      
2c5f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
2c600 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
2c610 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c620 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2c630 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
2c640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c660 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2c670 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2c680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c690 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2c6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2c6b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2c6c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2c6d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c6e0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c6f0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c710 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65 72   } .      pPager
2c720 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a  ->dbSize = dbSiz
2c730 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
2c740 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2c750 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2c760 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
2c770 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
2c780 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a  a master .    **
2c790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
2c7a0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
2c7b0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
2c7c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2c7d0 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a   .    ** or if z
2c7e0 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28  Master is NULL (
2c7f0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
2c800 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  l), then this ca
2c810 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
2c820 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
2c830 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
2c840 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
2c850 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2c860 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c870 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c880 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2c890 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2c8a0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74   file. If the at
2c8b0 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
2c8c0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  mization is bein
2c8d0 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74  g.    ** used, t
2c8e0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  his call will no
2c8f0 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75  t create the jou
2c900 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72  rnal file or per
2c910 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20  form any.    ** 
2c920 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a  real IO..    */.
2c930 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2c940 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2c950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c960 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c970 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c980 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ;..    /* Write 
2c990 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
2c9a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c9b0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  file. */.    rc 
2c9c0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2c9d0 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63  gelist(sqlite3Pc
2c9e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
2c9f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b  ager->pPCache));
2ca00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ca10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ca20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2ca30 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
2ca40 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63   );.      goto c
2ca50 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2ca60 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2ca70 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
2ca80 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
2ca90 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Cache);..    /* 
2caa0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
2cab0 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73  isk is not the s
2cac0 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20  ame size as the 
2cad0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a  database image,.
2cae0 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
2caf0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74  pager_truncate t
2cb00 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b  o grow or shrink
2cb10 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a   the file here..
2cb20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2cb30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70  Pager->dbSize!=p
2cb40 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2cb50 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  e ){.      Pgno 
2cb60 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64  nNew = pPager->d
2cb70 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d  bSize - (pPager-
2cb80 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d  >dbSize==PAGER_M
2cb90 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
2cba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2cbb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2cbc0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
2cbd0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2cbe0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
2cbf0 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, nNew);.      
2cc00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cc10 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2cc20 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2cc30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
2cc40 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20  nally, sync the 
2cc50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2cc60 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
2cc70 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f  r->noSync && !no
2cc80 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
2cc90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2cca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2ccb0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2ccc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
2ccd0 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
2cce0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
2ccf0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
2cd00 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
2cd10 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73    }..commit_phas
2cd20 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65  e_one_exit:.  re
2cd30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2cd40 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
2cd50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2cd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cd70 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  le has been comp
2cd80 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65  letely.** update
2cd90 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  d to reflect the
2cda0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
2cdb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2cdc0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  nsaction and.** 
2cdd0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
2cde0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2cdf0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e   still exists in
2ce00 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2ce10 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64   .** though, and
2ce20 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
2ce30 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
2ce40 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74  nt it will event
2ce50 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64  ually.** be used
2ce60 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
2ce70 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  l and the curren
2ce80 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  t transaction ro
2ce90 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
2cea0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
2ceb0 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
2cec0 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65  rnal file, eithe
2ced0 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a  r by deleting, .
2cee0 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ** truncating or
2cef0 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69   partially zeroi
2cf00 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69  ng it, so that i
2cf10 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
2cf20 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75   .** for hot-jou
2cf30 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f  rnal rollback. O
2cf40 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65  nce this is done
2cf50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2cf60 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62   is.** irrevocab
2cf70 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  ly committed..**
2cf80 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2cf90 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
2cfa0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2cfb0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
2cfc0 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f  er.** moves into
2cfd0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2cfe0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2cff0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d000 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2d010 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2d020 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
2d030 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2d040 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d060 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2d070 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2d080 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2d090 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f  called if a prio
2d0a0 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  r error has occu
2d0b0 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69  rred..  ** But i
2d0c0 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69  f (due to a codi
2d0d0 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65  ng error elsewhe
2d0e0 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  re in the system
2d0f0 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20  ) it does get.  
2d100 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20  ** called, just 
2d110 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
2d120 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f  error code witho
2d130 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2d140 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  g. */.  if( NEVE
2d150 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2d160 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
2d170 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
2d180 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2d190 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
2d1a0 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67  alled if the pag
2d1b0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20  er is not in at 
2d1c0 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52  least.  ** PAGER
2d1d0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2d1e0 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69   And indeed SQLi
2d1f0 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68  te never does th
2d200 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20  is. But it is.  
2d210 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20  ** nice to have 
2d220 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 74  this defensive t
2d230 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e  est here anyway.
2d240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2d250 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  R(pPager->state<
2d260 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20  PAGER_RESERVED) 
2d270 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2d280 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20  ERROR;..  /* An 
2d290 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
2d2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2d2b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
2d2c0 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
2d2d0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2d2e0 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
2d2f0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2d300 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
2d310 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
2d320 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
2d330 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
2d340 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2d350 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
2d360 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2d370 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
2d380 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
2d390 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
2d3a0 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
2d3b0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
2d3c0 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
2d3d0 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
2d3e0 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
2d3f0 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
2d400 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2d410 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
2d420 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
2d430 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
2d440 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
2d450 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2d460 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
2d470 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
2d480 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
2d490 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
2d4a0 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
2d4b0 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
2d4c0 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
2d4d0 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
2d4e0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2d4f0 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
2d500 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
2d510 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2d520 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2d530 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2d540 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
2d550 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2d560 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
2d570 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
2d580 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2d590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2d5a0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
2d5b0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
2d5c0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2d5d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d5e0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
2d5f0 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
2d600 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2d610 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
2d620 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2d630 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2d640 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2d650 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2d660 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2d670 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
2d680 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
2d690 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
2d6a0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
2d6b0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
2d6c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2d6d0 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
2d6e0 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
2d6f0 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
2d700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d710 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
2d720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2d730 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
2d740 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
2d750 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
2d760 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
2d770 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2d780 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
2d790 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
2d7a0 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
2d7b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2d7c0 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
2d7d0 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
2d7e0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
2d7f0 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
2d800 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
2d810 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
2d820 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
2d830 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
2d840 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
2d850 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
2d860 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
2d870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2d880 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
2d890 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
2d8a0 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
2d8b0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
2d8c0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
2d8d0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
2d8e0 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
2d8f0 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2d900 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2d910 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
2d920 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
2d930 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
2d940 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
2d950 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
2d960 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
2d970 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
2d980 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
2d990 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2d9a0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
2d9b0 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
2d9c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
2d9d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
2d9e0 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
2d9f0 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2da00 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2da10 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2da20 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
2da30 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
2da40 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
2da50 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
2da60 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
2da70 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
2da80 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
2da90 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2daa0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2dab0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
2dac0 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
2dad0 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
2dae0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2daf0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2db00 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2db10 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
2db20 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
2db30 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
2db40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2db50 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
2db60 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
2db70 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
2db80 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
2db90 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
2dba0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
2dbb0 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
2dbc0 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
2dbd0 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
2dbe0 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
2dbf0 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
2dc00 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
2dc10 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
2dc20 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
2dc30 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
2dc40 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
2dc50 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
2dc60 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2dc70 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
2dc80 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
2dc90 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2dca0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
2dcb0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
2dcc0 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
2dcd0 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
2dce0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2dcf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
2dd00 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
2dd10 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
2dd20 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
2dd30 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
2dd40 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
2dd50 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
2dd60 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
2dd70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2dd80 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
2dd90 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
2dda0 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
2ddb0 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
2ddc0 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
2ddd0 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
2dde0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
2ddf0 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
2de00 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
2de10 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2de20 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
2de30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2de40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2de50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2de60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2de70 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
2de80 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
2de90 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2dea0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2deb0 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2dec0 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ied || !isOpen(p
2ded0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2dee0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
2def0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2df00 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2df10 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73  tMaster);.  }els
2df20 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
2df30 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
2df40 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2df50 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
2df60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2df70 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2df80 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
2df90 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2dfa0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
2dfb0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2dfc0 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2dfd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2dfe0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
2dff0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ED ){.      int 
2e000 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
2e010 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e020 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2e030 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
2e040 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2e050 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2e060 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
2e070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e090 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
2e0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e0b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2e0c0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
2e0d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
2e0e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
2e0f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e100 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
2e110 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2e120 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
2e130 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
2e140 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
2e150 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
2e160 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
2e170 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
2e180 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
2e190 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
2e1a0 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74   .    ** persist
2e1b0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e1c0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
2e1d0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2e1e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e1f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e200 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
2e210 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
2e220 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
2e230 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
2e240 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2e250 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
2e260 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71  itable..*/.u8 sq
2e270 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
2e280 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
2e290 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e2a0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
2e2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e2c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2e2d0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2e2e0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
2e2f0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
2e300 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2e310 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2e320 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2e330 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e340 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2e350 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2e360 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2e370 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2e380 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
2e390 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2e3a0 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
2e3b0 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2e3c0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
2e3d0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
2e3e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e3f0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
2e400 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2e410 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
2e420 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2e430 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
2e440 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
2e450 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
2e460 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
2e470 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
2e480 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2e490 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e4a0 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
2e4b0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
2e4c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e4d0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
2e4e0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
2e4f0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
2e500 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
2e510 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e520 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
2e530 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
2e540 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
2e550 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
2e560 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2e570 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
2e580 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
2e590 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
2e5a0 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
2e5b0 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
2e5c0 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
2e5d0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
2e5e0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
2e5f0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
2e600 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
2e610 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2e620 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
2e630 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
2e640 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e650 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
2e660 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e670 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
2e680 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2e690 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
2e6a0 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
2e6b0 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
2e6c0 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
2e6d0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
2e6e0 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
2e6f0 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
2e700 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
2e710 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
2e720 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
2e730 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
2e740 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2e750 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
2e760 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
2e770 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
2e780 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2e790 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2e7a0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e7b0 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
2e7c0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
2e7d0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2e7e0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2e7f0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
2e800 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
2e810 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
2e820 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
2e830 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2e840 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2e850 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2e860 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
2e870 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
2e880 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2e890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e8b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2e8c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2e8d0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
2e8e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
2e8f0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2e900 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2e910 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
2e920 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
2e930 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
2e940 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2e950 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2e980 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2e990 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
2e9a0 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e9c0 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
2e9d0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
2e9e0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2e9f0 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
2ea00 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73  journal or the s
2ea10 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
2ea20 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  en or .    ** th
2ea30 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  e journal is alw
2ea40 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  ays stored in me
2ea50 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  mory */.    asse
2ea60 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2ea70 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f  epoint==0 || isO
2ea80 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2ea90 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2eaa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2eab0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2eac0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2ead0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
2eae0 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
2eaf0 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
2eb00 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
2eb10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
2eb20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
2eb30 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
2eb40 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
2eb50 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
2eb60 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
2eb70 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2eb80 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
2eb90 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
2eba0 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
2ebb0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
2ebc0 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
2ebd0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
2ebe0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
2ebf0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2ec00 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
2ec10 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
2ec20 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
2ec30 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
2ec40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2ec50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ec60 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
2ec70 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
2ec80 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
2ec90 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
2eca0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
2ecb0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
2ecc0 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
2ecd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2ece0 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
2ecf0 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
2ed00 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
2ed10 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
2ed20 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
2ed30 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
2ed40 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
2ed50 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2ed60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ed70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2ed80 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
2ed90 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
2eda0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2edb0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2edc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2edd0 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
2ede0 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
2edf0 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2ee00 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
2ee10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2ee20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ee30 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
2ee40 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
2ee50 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
2ee60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
2ee70 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
2ee80 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
2ee90 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2eea0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
2eeb0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2eec0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
2eed0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  e);.      if( !a
2eee0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2eef0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
2ef00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ef10 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2ef20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   }..    /* Open 
2ef30 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2ef40 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
2ef50 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  ready opened. */
2ef60 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2ef70 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2ef80 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e  ;.    assertTrun
2ef90 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
2efa0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
2efb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2efc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2efd0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
2efe0 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2eff0 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
2f000 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
2f010 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
2f020 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
2f030 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
2f040 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
2f050 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
2f060 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
2f070 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
2f080 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
2f090 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
2f0a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f0b0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
2f0c0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
2f0d0 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
2f0e0 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
2f0f0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
2f100 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
2f110 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
2f120 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
2f130 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
2f140 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
2f150 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
2f160 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
2f170 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
2f180 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
2f190 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2f1a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
2f1b0 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
2f1c0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
2f1d0 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
2f1e0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
2f1f0 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
2f200 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2f210 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
2f220 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
2f230 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
2f240 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2f250 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
2f260 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
2f270 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
2f280 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
2f290 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
2f2a0 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
2f2b0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
2f2c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2f2d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2f2e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
2f2f0 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
2f300 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2f310 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
2f320 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2f330 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2f340 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
2f350 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
2f360 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2f370 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
2f380 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2f390 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
2f3a0 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
2f3b0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
2f3c0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
2f3d0 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
2f3e0 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
2f3f0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2f400 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
2f410 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
2f420 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
2f430 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
2f440 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
2f450 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
2f460 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
2f470 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
2f480 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
2f490 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
2f4a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
2f4b0 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
2f4c0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
2f4d0 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
2f4e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f4f0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2f500 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2f510 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2f520 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
2f530 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2f540 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2f550 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
2f560 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
2f570 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
2f580 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
2f590 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2f5a0 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
2f5b0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
2f5c0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2f5d0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
2f5e0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2f5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f600 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
2f610 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2f620 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
2f630 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
2f640 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
2f650 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
2f660 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2f670 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
2f680 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
2f690 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2f6a0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2f6b0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2f6c0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
2f6d0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
2f6e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2f6f0 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
2f700 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
2f710 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
2f720 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
2f730 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
2f740 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
2f750 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
2f760 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
2f770 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
2f780 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
2f790 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
2f7a0 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
2f7b0 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
2f7c0 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
2f7d0 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
2f7e0 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
2f7f0 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
2f800 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41  epoint + (op==SA
2f810 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2f820 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
2f830 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
2f840 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2f850 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
2f860 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
2f870 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2f880 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2f890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2f8a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2f8b0 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
2f8c0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
2f8d0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
2f8e0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
2f8f0 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2f900 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
2f910 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
2f920 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2f930 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2f940 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
2f950 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
2f960 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
2f970 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
2f980 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
2f990 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
2f9a0 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
2f9b0 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
2f9c0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
2f9d0 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
2f9e0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
2f9f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69  NT_ROLLBACK && i
2fa00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2fa10 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
2fa20 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
2fa30 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
2fa40 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
2fa50 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
2fa60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2fa70 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
2fa80 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
2fa90 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
2faa0 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
2fab0 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
2fac0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2fad0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20  is a release of 
2fae0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2faf0 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74  vepoint, truncat
2fb00 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  e .    ** the su
2fb10 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72  b-journal to zer
2fb20 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
2fb30 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77   */.    if( nNew
2fb40 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  ==0 && op==SAVEP
2fb50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20  OINT_RELEASE && 
2fb60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2fb70 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2fb80 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2fb90 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20  _OK );.      rc 
2fba0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
2fbb0 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
2fbc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
2fbd0 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
2fbe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2fbf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fc00 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2fc10 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2fc20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2fc30 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2fc40 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2fc50 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
2fc60 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2fc70 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
2fc80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2fc90 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
2fca0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
2fcb0 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
2fcc0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
2fcd0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
2fce0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2fcf0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
2fd00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2fd10 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
2fd20 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2fd30 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
2fd40 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
2fd50 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
2fd60 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
2fd70 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
2fd80 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2fd90 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
2fda0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
2fdb0 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
2fdc0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2fdd0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
2fde0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2fdf0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2fe00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2fe10 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2fe20 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2fe30 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
2fe40 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2fe50 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2fe60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2fe70 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
2fe80 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
2fe90 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
2fea0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
2feb0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
2fec0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
2fed0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
2fee0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
2fef0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2ff00 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2ff10 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
2ff20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2ff30 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
2ff40 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
2ff50 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
2ff60 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
2ff70 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
2ff80 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
2ff90 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
2ffa0 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
2ffb0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
2ffc0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
2ffd0 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
2ffe0 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20  id*,int,int),.  
2fff0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
30000 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  e)(void*),.  voi
30010 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69  d *pCodec.){.  i
30020 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
30030 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
30040 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
30050 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50  r->pCodec);.  pP
30060 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70  ager->xCodec = p
30070 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30  Pager->memDb ? 0
30080 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   : xCodec;.  pPa
30090 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
300a0 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65  hng = xCodecSize
300b0 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Chng;.  pPager->
300c0 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f  xCodecFree = xCo
300d0 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65  decFree;.  pPage
300e0 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64  r->pCodec = pCod
300f0 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72  ec;.  pagerRepor
30100 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  tSize(pPager);.}
30110 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71  .static void *sq
30120 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64  lite3PagerGetCod
30130 65 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ec(Pager *pPager
30140 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
30150 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65  er->pCodec;.}.#e
30160 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
30170 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
30180 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
30190 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
301a0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
301b0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
301c0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
301d0 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
301e0 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
301f0 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
30200 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
30210 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
30220 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
30230 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
30240 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
30250 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
30260 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
30270 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
30280 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
30290 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
302a0 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
302b0 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
302c0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
302d0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
302e0 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
302f0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
30300 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
30310 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
30320 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
30330 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
30340 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
30350 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
30360 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
30370 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
30380 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
30390 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
303a0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
303b0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
303c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
303d0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
303e0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
303f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
30400 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
30410 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
30420 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
30430 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
30440 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
30450 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
30460 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
30470 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
30480 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
30490 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
304a0 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
304b0 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
304c0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
304d0 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
304e0 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
304f0 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
30500 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
30510 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
30520 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
30530 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
30540 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
30550 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
30560 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
30570 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
30580 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
30590 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
305a0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
305b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
305c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
305d0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
305e0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
305f0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
30600 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
30610 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  urs. Otherwise, 
30620 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
30630 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
30640 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
30650 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
30660 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
30670 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43  no pgno, int isC
30680 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20  ommit){.  PgHdr 
30690 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20  *pPgOld;        
306a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
306b0 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
306c0 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20  tten. */.  Pgno 
306d0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
306e0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76  ;       /* Old v
306f0 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e  alue of pPg->pgn
30700 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65  o, if sync is re
30710 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
30720 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30740 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
30750 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20  o origPgno;     
30760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30770 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e   original page n
30780 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  umber */..  asse
30790 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
307a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
307b0 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64  page being moved
307c0 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61   is dirty and ha
307d0 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64  s not been saved
307e0 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20   by the latest. 
307f0 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74   ** savepoint, t
30800 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72  hen save the cur
30810 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
30820 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
30830 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
30840 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69  rnal now. This i
30850 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  s required to ha
30860 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ndle the followi
30870 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a  ng scenario:.  *
30880 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a  *.  **   BEGIN;.
30890 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
308a0 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d  l page X, then m
308b0 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f  odify it in memo
308c0 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56  ry>.  **     SAV
308d0 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a  EPOINT one;.  **
308e0 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67         <Move pag
308f0 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  e X to location 
30900 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  Y>.  **     ROLL
30910 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a  BACK TO one;.  *
30920 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58  *.  ** If page X
30930 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65   were not writte
30940 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
30950 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f  rnal here, it wo
30960 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
30970 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74  possible to rest
30980 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ore its contents
30990 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
309a0 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a  ACK TO one".  **
309b0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20   statement were 
309c0 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  is processed..  
309d0 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e  **.  ** subjourn
309e0 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65  alPage() may nee
309f0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
30a00 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67  ace to store pPg
30a10 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a  ->pgno into.  **
30a20 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
30a30 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20  epoint bitvecs. 
30a40 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73  This is the reas
30a50 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  on this function
30a60 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e  .  ** may return
30a70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20   SQLITE_NOMEM.. 
30a80 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
30a90 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
30aa0 20 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75   .   && subjRequ
30ab0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
30ac0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
30ad0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
30ae0 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20  age(pPg)).  ){. 
30af0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30b00 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
30b10 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
30b20 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
30b30 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
30b40 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
30b50 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
30b60 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  o, (pPg->flags&P
30b70 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
30b80 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49  1:0, pgno));.  I
30b90 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
30ba0 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
30bb0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
30bc0 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68  no))..  /* If th
30bd0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
30be0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
30bf0 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
30c00 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
30c10 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
30c20 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
30c30 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
30c40 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
30c50 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
30c60 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
30c70 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
30c80 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
30c90 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
30ca0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
30cb0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
30cc0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
30cd0 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
30ce0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
30cf0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
30d00 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
30d10 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
30d20 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
30d30 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
30d40 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
30d50 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
30d60 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
30d70 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
30d80 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
30d90 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
30da0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
30db0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
30dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
30dd0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
30de0 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
30df0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
30e00 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
30e10 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
30e20 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
30e30 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
30e40 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
30e50 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
30e60 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
30e70 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
30e80 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
30e90 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
30ea0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
30eb0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
30ec0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
30ed0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
30ee0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
30ef0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
30f00 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
30f10 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
30f20 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
30f30 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
30f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
30f50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
30f60 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
30f70 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
30f80 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
30f90 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
30fa0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
30fb0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
30fc0 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d  rop(pPgOld);.  }
30fd0 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70  ..  origPgno = p
30fe0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69  Pg->pgno;.  sqli
30ff0 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
31000 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69  g, pgno);.  sqli
31010 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
31020 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
31030 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
31040 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
31050 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
31060 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
31070 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
31080 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
31090 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
310a0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
310b0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
310c0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
310d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
310e0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
310f0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
31100 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
31110 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
31120 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
31130 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72  .    ** "is jour
31140 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c  naled" bitvec fl
31150 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ag has been set.
31160 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
31170 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20  e remedied by.  
31180 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65    ** loading the
31190 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
311a0 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
311b0 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
311c0 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
311d0 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  * flag..    **. 
311e0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74     ** If the att
311f0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65  empt to load the
31200 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
31210 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c  age-cache fails,
31220 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20   (due.    ** to 
31230 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
31240 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72   failure), clear
31250 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20   the bit in the 
31260 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20  pInJournal[].   
31270 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72   ** array. Other
31280 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67  wise, if the pag
31290 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20  e is loaded and 
312a0 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e  written again in
312b0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61  .    ** this tra
312c0 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
312d0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
312e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
312f0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
31300 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f  t is synced into
31310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31320 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20  e. This way, it 
31330 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20  may end up in.  
31340 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
31350 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74   file twice, but
31360 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
31370 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20  roblem..    **. 
31380 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
31390 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
313a0 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
313b0 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
313c0 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
313d0 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
313e0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
313f0 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
31400 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
31410 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31420 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
31430 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
31440 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
31450 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
31460 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
31470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31480 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
31490 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67  edSyncPgno<=pPag
314a0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
314b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
314c0 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  ( pPager->pTmpSp
314d0 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ace!=0 );.      
314e0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43    sqlite3BitvecC
314f0 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e  lear(pPager->pIn
31500 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e  Journal, needSyn
31510 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70  cPgno, pPager->p
31520 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
31530 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
31540 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
31550 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
31560 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
31570 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
31580 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  0 && !MEMDB );. 
31590 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73     pPgHdr->flags
315a0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
315b0 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  YNC;.    sqlite3
315c0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
315d0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c  pPgHdr);.    sql
315e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
315f0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  PgHdr);.  }..  /
31600 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  *.  ** For an in
31610 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
31620 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
31630 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
31640 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20  ntinues.  ** to 
31650 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74  exist, in case t
31660 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  he transaction n
31670 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63  eeds to roll bac
31680 6b 2e 20 20 57 65 20 61 6c 6c 6f 63 61 74 65 0a  k.  We allocate.
31690 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 6f    ** the page no
316a0 77 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 61 74  w, instead of at
316b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 62 65 63 61 75   rollback, becau
316c0 73 65 20 77 65 20 63 61 6e 20 62 65 74 74 65 72  se we can better
316d0 20 64 65 61 6c 0a 20 20 2a 2a 20 77 69 74 68 20   deal.  ** with 
316e0 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
316f0 20 65 72 72 6f 72 20 6e 6f 77 2e 20 20 54 69 63   error now.  Tic
31700 6b 65 74 20 23 33 37 36 31 2e 0a 20 20 2a 2f 0a  ket #3761..  */.
31710 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
31720 20 20 20 44 62 50 61 67 65 20 2a 70 4e 65 77 3b     DbPage *pNew;
31730 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31740 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
31750 61 67 65 72 2c 20 6f 72 69 67 50 67 6e 6f 2c 20  ager, origPgno, 
31760 26 70 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 69  &pNew, 1);.    i
31770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31780 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31790 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
317a0 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20   origPgno);.    
317b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
317c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
317d0 67 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a  gerUnref(pNew);.
317e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
317f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
31800 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
31810 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
31820 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
31830 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
31840 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
31850 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
31860 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
31870 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
31880 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
31890 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
318a0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
318b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
318c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
318d0 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
318e0 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
318f0 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
31900 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
31910 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
31920 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
31930 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
31940 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
31950 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b  urn pPg->pExtra;
31960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
31970 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
31980 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
31990 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
319a0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
319b0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
319c0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
319d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
319e0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
319f0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31a00 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
31a10 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
31a20 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
31a30 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
31a40 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
31a50 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
31a60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
31a70 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
31a80 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
31a90 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
31aa0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
31ab0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
31ac0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
31ad0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
31ae0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
31af0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
31b00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
31b10 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
31b20 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
31b30 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
31b40 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
31b50 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
31b60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
31b70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
31b80 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
31b90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31ba0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
31bb0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
31bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
31bd0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31be0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
31bf0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
31c00 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
31c10 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
31c20 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
31c30 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
31c40 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
31c50 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
31c60 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
31c70 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  veMode = (u8)eMo
31c80 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
31c90 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
31ca0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
31cb0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
31cc0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
31cd0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
31ce0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
31cf0 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
31d00 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
31d10 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
31d20 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
31d30 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a  NALMODE_DELETE.*
31d40 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31d50 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
31d60 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
31d70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
31d80 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
31d90 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20  NALMODE_OFF.**  
31da0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
31db0 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a  ODE_MEMORY.**.**
31dc0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
31dd0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
31de0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
31df0 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  l_mode is set to
31e00 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70   the.** value sp
31e10 65 63 69 66 69 65 64 20 69 66 20 74 68 65 20 63  ecified if the c
31e20 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64  hange is allowed
31e30 2e 20 20 54 68 65 20 63 68 61 6e 67 65 20 69 73  .  The change is
31e40 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66   disallowed.** f
31e50 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
31e60 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20   reasons:.**.** 
31e70 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72    *  An in-memor
31e80 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f  y database can o
31e90 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75  nly have its jou
31ea0 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f  rnal_mode set to
31eb0 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72   _OFF.**      or
31ec0 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20   _MEMORY..**.** 
31ed0 20 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c    *  The journal
31ee0 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65   mode may not be
31ef0 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61   changed while a
31f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
31f10 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  active..**.** Th
31f20 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63  e returned indic
31f30 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
31f40 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
31f50 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  d) journal-mode.
31f60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
31f70 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  agerJournalMode(
31f80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
31f90 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
31fa0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
31fb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
31fc0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
31fd0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
31fe0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
31ff0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
32000 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32010 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
32020 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ATE.            
32030 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
32050 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  IST.            
32060 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32070 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
32080 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
32090 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
320a0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
320b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
320c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
320d0 55 45 52 59 3c 30 20 29 3b 0a 20 20 69 66 28 20  UERY<0 );.  if( 
320e0 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28  eMode>=0.   && (
320f0 21 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d  !MEMDB || eMode=
32100 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32110 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
32120 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32130 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32140 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26 26 20  MODE_OFF).   && 
32150 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
32160 69 65 64 0a 20 20 20 26 26 20 28 21 69 73 4f 70  ied.   && (!isOp
32170 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
32180 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  || 0==pPager->jo
32190 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20  urnalOff).  ){. 
321a0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
321b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
321c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
321d0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
321e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
321f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
32200 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
32210 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
32220 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
32230 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
32240 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
32250 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
32260 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
32270 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74  iles..**.** Sett
32280 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d  ing the size lim
32290 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e  it to -1 means n
322a0 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72  o limit is enfor
322b0 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d  ced..** An attem
322c0 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69  pt to set a limi
322d0 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d  t smaller than -
322e0 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  1 is a no-op..*/
322f0 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65  .i64 sqlite3Page
32300 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  rJournalSizeLimi
32310 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
32320 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20   i64 iLimit){.  
32330 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29  if( iLimit>=-1 )
32340 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
32350 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
32360 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72   iLimit;.  }.  r
32370 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  eturn pPager->jo
32380 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
32390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
323a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
323b0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
323c0 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62   variable. The b
323d0 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20  ackup module.** 
323e0 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e  in backup.c main
323f0 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e  tains the conten
32400 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62  t of this variab
32410 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a  le. This module.
32420 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75  ** uses it opaqu
32430 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65  ely as an argume
32440 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63  nt to sqlite3Bac
32450 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64  kupRestart() and
32460 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75  .** sqlite3Backu
32470 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a  pUpdate() only..
32480 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  */.sqlite3_backu
32490 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72  p **sqlite3Pager
324a0 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20  BackupPtr(Pager 
324b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
324c0 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63  rn &pPager->pBac
324d0 6b 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  kup;.}..#endif /
324e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
324f0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.