/ Hex Artifact Content
Login

Artifact e7171336ffb0f8adc41e55b63dbb2bc5a616a1ae:


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 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 38  : pager.c,v 1.58
0350: 36 20 32 30 30 39 2f 30 35 2f 30 36 20 31 38 3a  6 2009/05/06 18:
0360: 35 37 3a 31 30 20 73 68 61 6e 65 20 45 78 70 20  57:10 shane Exp 
0370: 24 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  $.*/.#ifndef SQL
0380: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0390: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
03a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
03b0: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
03c0: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
03d0: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03e0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03f0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
0400: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0410: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0420: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
0430: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0440: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0450: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0460: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0470: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0480: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0490: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
04a0: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
04b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
04c0: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
04d0: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04e0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04f0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
0500: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
0510: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
0520: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
0530: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0540: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0550: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0560: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0570: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0580: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0590: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
05a0: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
05b0: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
05c0: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
05d0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05e0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05f0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
0600: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
0610: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
0620: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0630: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0640: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0660: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0670: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0680: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0690: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
06a0: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
06b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
06c0: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
06d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06e0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0700: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
0710: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
0720: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
0730: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0750: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0760: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0770: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0780: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0790: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
07c0: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
07d0: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
0800: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
0810: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
0820: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0830: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0840: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0850: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0860: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0870: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0880: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0890: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
08c0: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
08d0: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08e0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
0910: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
0920: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
0930: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0950: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0960: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0970: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
09a0: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
09b0: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
09c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09d0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09e0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09f0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0a00: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0a10: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
0a20: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a50: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a60: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a80: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a90: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0aa0: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0ab0: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ad0: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0ae0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0af0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0b00: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0b10: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0b20: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0b30: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b40: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b50: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b60: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b70: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0ba0: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0bb0: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0bc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bd0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0be0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bf0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0c00: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0c30: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c60: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c70: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c80: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c90: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0ca0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0cb0: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0cc0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0cd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ce0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cf0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0d00: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0d10: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0d20: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0d30: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d40: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d50: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d60: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d70: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d80: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d90: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0da0: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0db0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0dc0: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0dd0: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0de0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0df0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0e00: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0e10: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0e20: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0e30: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e40: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e50: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e60: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e70: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e90: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0ea0: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0eb0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0ec0: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0ed0: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ee0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0ef0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0f00: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0f10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0f20: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0f30: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f40: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f50: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f60: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f70: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f80: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f90: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0fa0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0fb0: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0fc0: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0fd0: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fe0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0ff0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
1000: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
1010: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
1020: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1030: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1040: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1050: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1060: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1070: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1080: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1090: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10a0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10b0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10c0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10d0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10e0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10f0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1100: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41        5../*.** A
1110: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
1120: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
1130: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1140: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1150: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1160: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1170: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
1180: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
1190: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
11a0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
11b0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
11c0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
11d0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
11e0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
11f0: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
1200: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
1210: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
1220: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
1230: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
1240: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
1250: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
1260: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65  ximum allowed se
1270: 63 74 6f 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e  ctor size. 16MB.
1280: 20 49 66 20 74 68 65 20 78 53 65 63 74 6f 72 73   If the xSectors
1290: 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a  ize() method .**
12a0: 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65   returns a value
12b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
12c0: 73 2c 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54  s, then MAX_SECT
12d0: 4f 52 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20  OR_SIZE is used 
12e0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73  instead..** This
12f0: 20 63 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62   could conceivab
1300: 6c 79 20 63 61 75 73 65 20 63 6f 72 72 75 70 74  ly cause corrupt
1310: 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ion following a 
1320: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e  power failure on
1330: 0a 2a 2a 20 73 75 63 68 20 61 20 73 79 73 74 65  .** such a syste
1340: 6d 2e 20 54 68 69 73 20 69 73 20 63 75 72 72 65  m. This is curre
1350: 6e 74 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65  ntly an undocume
1360: 6e 74 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23  nted limit..*/.#
1370: 64 65 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f  define MAX_SECTO
1380: 52 5f 53 49 5a 45 20 30 78 30 31 30 30 30 30 30  R_SIZE 0x0100000
1390: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
13a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
13b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
13c0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
13d0: 65 61 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73  each active.** s
13e0: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61  avepoint and sta
13f0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1400: 6f 6e 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  on in the system
1410: 2e 20 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63  . All such struc
1420: 74 75 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f  tures.** are sto
1430: 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
1440: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
1450: 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c  ray, which is al
1460: 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72  located and.** r
1470: 65 73 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c  esized using sql
1480: 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3Realloc()..*
1490: 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65  *.** When a save
14a0: 70 6f 69 6e 74 20 69 73 20 63 72 65 61 74 65 64  point is created
14b0: 2c 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  , the PagerSavep
14c0: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
14d0: 66 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20  field is.** set 
14e0: 74 6f 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e  to 0. If a journ
14f0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
1500: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61  tten into the ma
1510: 69 6e 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  in journal while
1520: 0a 2a 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e  .** the savepoin
1530: 74 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 65  t is active, the
1540: 6e 20 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  n iHdrOffset is 
1550: 73 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20  set to the byte 
1560: 6f 66 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64  offset .** immed
1570: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1580: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
1590: 6c 20 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e  l record written
15a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a   into the main.*
15b0: 2a 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  * journal before
15c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
15d0: 64 65 72 2e 20 54 68 69 73 20 69 73 20 72 65 71  der. This is req
15e0: 75 69 72 65 64 20 64 75 72 69 6e 67 20 73 61 76  uired during sav
15f0: 65 70 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61  epoint.** rollba
1600: 63 6b 20 28 73 65 65 20 70 61 67 65 72 50 6c 61  ck (see pagerPla
1610: 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29  ybackSavepoint()
1620: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
1630: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
1640: 69 6e 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  int PagerSavepoi
1650: 6e 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nt;.struct Pager
1660: 53 61 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36  Savepoint {.  i6
1670: 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20  4 iOffset;      
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1690: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e  arting offset in
16a0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
16b0: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 73 65  .  i64 iHdrOffse
16c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
16d0: 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
16e0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76    Bitvec *pInSav
16f0: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
1700: 2a 20 53 65 74 20 6f 66 20 70 61 67 65 73 20 69  * Set of pages i
1710: 6e 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74  n this savepoint
1720: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67   */.  Pgno nOrig
1730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1740: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e     /* Original n
1750: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1760: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  n file */.  Pgno
1770: 20 69 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   iSubRec;       
1780: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1790: 78 20 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72  x of first recor
17a0: 64 20 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d in sub-journal
17b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
17c0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
17d0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
17e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1800: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
1810: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
1820: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
1830: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
1840: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a  E_CORRUPT, or.**
1850: 20 20 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c     or SQLITE_FUL
1860: 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74  L. Once one of t
1870: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65  he first three e
1880: 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74  rrors occurs, it
1890: 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 20 20 61   persists.**   a
18a0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
18b0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
18c0: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
18d0: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
18e0: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  .**   SQLITE_FUL
18f0: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
1900: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
1910: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
1920: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
1930: 2a 2a 20 20 20 6e 65 78 74 20 73 75 63 63 65 73  **   next succes
1940: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
1950: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
1960: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
1970: 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45  lso,.**   SQLITE
1980: 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61  _FULL does not a
1990: 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  ffect the sqlite
19a0: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
19b0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
19c0: 75 70 28 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20  up().**   APIs, 
19d0: 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62  they may still b
19e0: 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75  e used successfu
19f0: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a  lly..**.** dbSiz
1a00: 65 56 61 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20  eValid, dbSize, 
1a10: 64 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69  dbOrigSize, dbFi
1a20: 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d  leSize.**.**   M
1a30: 61 6e 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65  anaging the size
1a40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a50: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69   file in pages i
1a60: 73 20 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c  s a little compl
1a70: 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65  icated..**   The
1a80: 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e   variable Pager.
1a90: 64 62 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  dbSize contains 
1aa0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1ab0: 67 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ges that the dat
1ac0: 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65  abase.**   image
1ad0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
1ae0: 69 6e 73 2e 20 41 73 20 74 68 65 20 64 61 74 61  ins. As the data
1af0: 62 61 73 65 20 69 6d 61 67 65 20 67 72 6f 77 73  base image grows
1b00: 20 6f 72 20 73 68 72 69 6e 6b 73 20 74 68 69 73   or shrinks this
1b10: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 69  .**   variable i
1b20: 73 20 75 70 64 61 74 65 64 2e 20 54 68 65 20 76  s updated. The v
1b30: 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62  ariable Pager.db
1b40: 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e  FileSize contain
1b50: 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
1b60: 20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68    of pages in th
1b70: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b80: 20 54 68 69 73 20 6d 61 79 20 62 65 20 64 69 66   This may be dif
1b90: 66 65 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65  ferent from Page
1ba0: 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66  r.dbSize.**   if
1bb0: 20 73 6f 6d 65 20 70 61 67 65 73 20 68 61 76 65   some pages have
1bc0: 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74   been appended t
1bd0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
1be0: 6d 61 67 65 20 62 75 74 20 6e 6f 74 20 79 65 74  mage but not yet
1bf0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75   written.**   ou
1c00: 74 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  t from the cache
1c10: 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66   to the actual f
1c20: 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20  ile on disk. Or 
1c30: 69 66 20 74 68 65 20 69 6d 61 67 65 20 68 61 73  if the image has
1c40: 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63   been.**   trunc
1c50: 61 74 65 64 20 62 79 20 61 6e 20 69 6e 63 72 65  ated by an incre
1c60: 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70  mental-vacuum op
1c70: 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 50 61 67  eration. The Pag
1c80: 65 72 2e 64 62 4f 72 69 67 53 69 7a 65 20 76 61  er.dbOrigSize va
1c90: 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74  riable.**   cont
1ca0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1cb0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1cc0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
1cd0: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
1ce0: 2a 2a 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e  **   transaction
1cf0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65   was opened. The
1d00: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c   contents of all
1d10: 20 74 68 72 65 65 20 6f 66 20 74 68 65 73 65 20   three of these 
1d20: 76 61 72 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20  variables is.** 
1d30: 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65    only guarantee
1d40: 64 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74 20  d to be correct 
1d50: 69 66 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50  if the boolean P
1d60: 61 67 65 72 2e 64 62 53 69 7a 65 56 61 6c 69 64  ager.dbSizeValid
1d70: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1d80: 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68    TODO: Under wh
1d90: 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73  at conditions is
1da0: 20 64 62 53 69 7a 65 56 61 6c 69 64 20 73 65 74   dbSizeValid set
1db0: 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a  ? Cleared?.**.**
1dc0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1dd0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f  .**.**   This bo
1de0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 20 69  olean variable i
1df0: 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
1e00: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
1e10: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20  nge-counter .** 
1e20: 20 20 28 74 68 65 20 34 2d 62 79 74 65 20 68 65    (the 4-byte he
1e30: 61 64 65 72 20 66 69 65 6c 64 20 61 74 20 62 79  ader field at by
1e40: 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
1e50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e60: 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20  e) is .**   not 
1e70: 75 70 64 61 74 65 64 20 6d 6f 72 65 20 6f 66 74  updated more oft
1e80: 65 6e 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  en than necessar
1e90: 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69  y. .**.**   It i
1ea0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 77 68  s set to true wh
1eb0: 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1ec0: 75 6e 74 65 72 20 66 69 65 6c 64 20 69 73 20 75  unter field is u
1ed0: 70 64 61 74 65 64 2c 20 77 68 69 63 68 20 0a 2a  pdated, which .*
1ee0: 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  *   can only hap
1ef0: 70 65 6e 20 69 66 20 61 6e 20 65 78 63 6c 75 73  pen if an exclus
1f00: 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
1f10: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f20: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69   file..**   It i
1f30: 73 20 63 6c 65 61 72 65 64 20 28 73 65 74 20 74  s cleared (set t
1f40: 6f 20 66 61 6c 73 65 29 20 77 68 65 6e 65 76 65  o false) wheneve
1f50: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
1f60: 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c  ock is .**   rel
1f70: 69 6e 71 75 69 73 68 65 64 20 6f 6e 20 74 68 65  inquished on the
1f80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f90: 45 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  Each time a tran
1fa0: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
1fb0: 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63  tted,.**   The c
1fc0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1fd0: 6c 61 67 20 69 73 20 69 6e 73 70 65 63 74 65 64  lag is inspected
1fe0: 2e 20 49 66 20 69 74 20 69 73 20 74 72 75 65 2c  . If it is true,
1ff0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20   the work of.** 
2000: 20 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 63    updating the c
2010: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73  hange-counter is
2020: 20 6f 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65   omitted for the
2030: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2040: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tion..**.**   Th
2050: 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61  is mechanism mea
2060: 6e 73 20 74 68 61 74 20 77 68 65 6e 20 72 75 6e  ns that when run
2070: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2080: 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63  e mode, a connec
2090: 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20  tion .**   need 
20a0: 6f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  only update the 
20b0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f  change-counter o
20c0: 6e 63 65 2c 20 66 6f 72 20 74 68 65 20 66 69 72  nce, for the fir
20d0: 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  st transaction.*
20e0: 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  *   committed..*
20f0: 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a  *.** dbModified.
2100: 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f  **.**   The dbMo
2110: 64 69 66 69 65 64 20 66 6c 61 67 20 69 73 20 73  dified flag is s
2120: 65 74 20 77 68 65 6e 65 76 65 72 20 61 20 64 61  et whenever a da
2130: 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20 64  tabase page is d
2140: 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20  irtied..**   It 
2150: 69 73 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  is cleared at th
2160: 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 74 72  e end of each tr
2170: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2180: 20 20 20 49 74 20 69 73 20 75 73 65 64 20 77 68     It is used wh
2190: 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72  en committing or
21a0: 20 6f 74 68 65 72 77 69 73 65 20 65 6e 64 69 6e   otherwise endin
21b0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
21c0: 20 49 66 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d   If.**   the dbM
21d0: 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69 73 20  odified flag is 
21e0: 63 6c 65 61 72 20 74 68 65 6e 20 6c 65 73 73 20  clear then less 
21f0: 77 6f 72 6b 20 68 61 73 20 74 6f 20 62 65 20 64  work has to be d
2200: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e  one..**.** journ
2210: 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20  alStarted.**.** 
2220: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2230: 65 74 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  et whenever the 
2240: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2250: 20 69 73 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a   is synced. .**.
2260: 2a 2a 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f  **   The point o
2270: 66 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74  f this flag is t
2280: 68 61 74 20 69 74 20 6d 75 73 74 20 62 65 20 73  hat it must be s
2290: 65 74 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a  et after the .**
22a0: 20 20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c     first journal
22b0: 20 68 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75   header in a jou
22c0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
22d0: 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
22e0: 6b 2e 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68  k..**   After th
22f0: 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
2300: 20 6e 65 77 20 70 61 67 65 73 20 61 70 70 65 6e   new pages appen
2310: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
2320: 61 73 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74  ase .**   do not
2330: 20 6e 65 65 64 20 74 68 65 20 50 47 48 44 52 5f   need the PGHDR_
2340: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73  NEED_SYNC flag s
2350: 65 74 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e  et, as they do n
2360: 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20  ot need.**   to 
2370: 77 61 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e  wait for a journ
2380: 61 6c 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74  al sync before t
2390: 68 65 79 20 63 61 6e 20 62 65 20 77 72 69 74 74  hey can be writt
23a0: 65 6e 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74  en out to.**   t
23b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23c0: 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70   (see function p
23d0: 61 67 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a  ager_write())..*
23e0: 2a 20 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65  *   .** setMaste
23f0: 72 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  r.**.**   This v
2400: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2410: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
2420: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2430: 6c 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20  l file name.**  
2440: 20 28 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c   (if any) is onl
2450: 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  y written into t
2460: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2470: 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68  once..**.**   Wh
2480: 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
2490: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
24a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
24b0: 66 69 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e  file name (if an
24c0: 79 29 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77  y).**   may be w
24d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69  journal file whi
24f0: 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
2500: 73 74 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41  still in.**   PA
2510: 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
2520: 74 65 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68  te (see CommitPh
2530: 61 73 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65  aseOne() for the
2540: 20 61 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20   action). It.** 
2550: 20 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20    then attempts 
2560: 74 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e  to upgrade to an
2570: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
2580: 20 49 66 20 74 68 69 73 20 61 74 74 65 6d 70 74   If this attempt
2590: 0a 2a 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65  .**   fails, the
25a0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61  n SQLITE_BUSY ma
25b0: 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  y be returned to
25c0: 20 74 68 65 20 75 73 65 72 20 61 6e 64 20 74 68   the user and th
25d0: 65 20 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20  e user.**   may 
25e0: 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69  attempt to commi
25f0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
2600: 6e 20 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63  n again later (c
2610: 61 6c 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d  alling.**   Comm
2620: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61  itPhaseOne() aga
2630: 69 6e 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69  in). This flag i
2640: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
2650: 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20   that the .**   
2660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2670: 61 6d 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74  ame is only writ
2680: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2690: 61 6c 20 66 69 6c 65 20 74 68 65 20 66 69 72 73  al file the firs
26a0: 74 0a 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d  t.**   time Comm
26b0: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
26c0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f  called..**.** do
26d0: 4e 6f 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20  NotSync.**.**   
26e0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
26f0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
2700: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
2710: 57 72 69 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e  Write()..**.** n
2720: 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20  eedSync.**.**   
2730: 54 4f 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62  TODO: It might b
2740: 65 20 65 61 73 69 65 72 20 74 6f 20 73 65 74 20  e easier to set 
2750: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e  this variable in
2760: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
2770: 28 29 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74  ().**   and writ
2780: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
2790: 20 6f 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74   only. Change it
27a0: 73 20 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e  s meaning to "un
27b0: 73 79 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20  synced data.**  
27c0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
27d0: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
27e0: 22 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  "..**.** subjInM
27f0: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
2800: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
2810: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
2820: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
2830: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
2840: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
2850: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
2860: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2870: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
2880: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
2890: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
28a0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
28b0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
28c0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
28d0: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
28e0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
28f0: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
2900: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
2910: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
2920: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
2930: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
2940: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
2950: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
2960: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2980: 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52   On of the PAGER
2990: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
29a0: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
29b0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
29c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
29d0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
29e0: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
29f0: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a10: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2a20: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2a30: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  cks */.  u8 noSy
2a40: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2a50: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
2a60: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2a70: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
2a80: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
2a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
2aa0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
2ab0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
2ac0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
2ad0: 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20   sync_flags;    
2ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2af0: 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   of SYNC_NORMAL 
2b00: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a  or SYNC_FULL */.
2b10: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b30: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
2b40: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
2b50: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
2b80: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
2b90: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2bc0: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2bd0: 4f 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  O */..  /* The f
2be0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
2bf0: 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c  ontains those cl
2c00: 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ass members that
2c10: 20 61 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79   are dynamically
2c20: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64  .  ** modified d
2c30: 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65  uring normal ope
2c40: 72 61 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68  rations. The oth
2c50: 65 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  er variables in 
2c60: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 20  this structure. 
2c70: 20 2a 2a 20 61 72 65 20 65 69 74 68 65 72 20 63   ** are either c
2c80: 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f  onstant througho
2c90: 75 74 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ut the lifetime 
2ca0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72  of the pager, or
2cb0: 20 65 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20   else.  ** used 
2cc0: 74 6f 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75  to store configu
2cd0: 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  ration parameter
2ce0: 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2cf0: 65 20 77 61 79 20 74 68 65 20 70 61 67 65 72 20  e way the pager 
2d00: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a  .  ** operates..
2d10: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73    **.  ** The 's
2d20: 74 61 74 65 27 20 76 61 72 69 61 62 6c 65 20 69  tate' variable i
2d30: 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d  s described in m
2d40: 6f 72 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67  ore detail along
2d50: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64   with the.  ** d
2d60: 65 73 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74  escriptions of t
2d70: 68 65 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79  he values it may
2d80: 20 74 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e   take - PAGER_UN
2d90: 4c 4f 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f  LOCK etc. Many o
2da0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  f the.  ** other
2db0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2dc0: 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73  is block are des
2dd0: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f  cribed in the co
2de0: 6d 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a  mment directly .
2df0: 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20    ** above this 
2e00: 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e  class definition
2e10: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ..  */.  u8 stat
2e20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2e30: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
2e40: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
2e50: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2e60: 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65  /.  u8 dbModifie
2e70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2e80: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
2e90: 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73   are any changes
2ea0: 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20   to the Db */.  
2eb0: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
2ee0: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
2ef0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2f00: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
2f10: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
2f20: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
2f30: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2f40: 65 64 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67  ed */.  u8 chang
2f50: 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20  eCountDone;     
2f60: 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72      /* Set after
2f70: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2f80: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f90: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2fa0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2fc0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2fd0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2fe0: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
2ff0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3000: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
3010: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
3020: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
3030: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
3040: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
3050: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
3060: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
3070: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
3080: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
3090: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
30a0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
30b0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
30c0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
30d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30e0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
30f0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
3100: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
3110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
3120: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
3130: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
3140: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
3150: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
3160: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3170: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3190: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31b0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
31c0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
31d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
3200: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
3210: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
3220: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
3230: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
3240: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
3250: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
3260: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
3270: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
3280: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3290: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
32a0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
32b0: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
32c0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
32d0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
32e0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
32f0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
3300: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
3310: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3320: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
3330: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3340: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
3350: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3360: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
3370: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
3380: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
3390: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
33a0: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
33d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
33e0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
33f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
3400: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
3410: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
3420: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
3430: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
3440: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
3450: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
3460: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
3470: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
3480: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
3490: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
34a0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
34b0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
34c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
34d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
34e0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
34f0: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
3500: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
3510: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
3520: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
3530: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
3540: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
3550: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3560: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
3570: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
3580: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e  ollback */..  in
3590: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
35a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
35b0: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
35c0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
35d0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ry page */.  u32
35e0: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
35f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
3600: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
3610: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
3620: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3640: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3650: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e   a page */.  Pgn
3660: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
3670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
3680: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
3690: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
36b0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
36c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
36d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
36e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
36f0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3700: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
3710: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
3720: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
3730: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
3740: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
3750: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
3760: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
3770: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
3780: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
3790: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
37a0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
37b0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
37c0: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
37d0: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
37e0: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
37f0: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
3800: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
3810: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
3820: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
3830: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
3840: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
3850: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
3860: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3870: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
3880: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3890: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
38a0: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
38b0: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
38c0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
38d0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
38e0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
38f0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
3900: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
3910: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
3920: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
3930: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3950: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3960: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3970: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3980: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3990: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
39a0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
39b0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
39c0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
39d0: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
39e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
39f0: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3a00: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3a10: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3a20: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3a30: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3a40: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3a50: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3a60: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3a70: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3a80: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3a90: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3aa0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3ab0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3ac0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3ad0: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3ae0: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3af0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3b00: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3b10: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3b20: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3b30: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3b40: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3b50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3b60: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3b70: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3b80: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3b90: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3bb0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3bc0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3bd0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3be0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3bf0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3c00: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3c10: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3c20: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3c30: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3c40: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3c50: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3c60: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3c70: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3c80: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3c90: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3ca0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3cb0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3cc0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3cd0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3ce0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3cf0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3d10: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3d20: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3d30: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3d40: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3d50: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3d70: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3d80: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3d90: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3da0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3db0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3dc0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3dd0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3de0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3df0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3e00: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3e10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3e20: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3e30: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3e40: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3e50: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3e60: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3e70: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3e80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3e90: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3ea0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3eb0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ec0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3ed0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3ee0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3ef0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3f00: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
3f10: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
3f20: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
3f30: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
3f40: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
3f50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
3f60: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3f70: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3f80: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3f90: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3fa0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3fb0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3fc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3fd0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3fe0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3ff0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4000: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4010: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4020: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4030: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4040: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4050: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4060: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
4070: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
4080: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
4090: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
40a0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
40b0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
40c0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
40d0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
40e0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
40f0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4100: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4110: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4120: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4130: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4140: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4150: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4160: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
4170: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
4180: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
4190: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
41a0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
41b0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
41c0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
41d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
41e0: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
41f0: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4200: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4210: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4220: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4230: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4240: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4250: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4260: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
4270: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
4280: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
4290: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
42a0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
42b0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
42c0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
42d0: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
42e0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
42f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4300: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4310: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4320: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4330: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4340: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4350: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4360: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
4370: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
4380: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
4390: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
43a0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
43b0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
43c0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
43d0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
43e0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
43f0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4400: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4410: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4420: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4440: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4450: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4460: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
4470: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
4480: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4490: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
44a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
44b0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
44c0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
44d0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
44e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
44f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4500: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4510: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4520: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4530: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4540: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4550: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4560: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
4570: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
4580: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
4590: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
45a0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
45b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
45c0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
45d0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
45e0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
45f0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4600: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4610: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4620: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4630: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4640: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4650: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4660: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
4670: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4680: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4690: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
46a0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
46b0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
46c0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
46d0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
46e0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
46f0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4700: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4710: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4720: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4730: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4740: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4750: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4760: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
4770: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
4780: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
4790: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
47a0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
47b0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
47c0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
47d0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
47e0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
47f0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4800: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4810: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4820: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4830: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4840: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4850: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4860: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
4870: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
4880: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
4890: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
48a0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
48b0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
48c0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
48d0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
48e0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
48f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4900: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4910: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4920: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4930: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4940: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4950: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4960: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4970: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4980: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4990: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
49a0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
49b0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
49c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
49d0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
49e0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
49f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4a00: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4a10: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4a20: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4a40: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4a50: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4a60: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4a70: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4a80: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4a90: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4aa0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4ab0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4ac0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4ad0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4ae0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4af0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4b00: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4b10: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4b20: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4b30: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4b40: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4b50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4b60: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4b70: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4b80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4b90: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4ba0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4bb0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4bc0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4bd0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4be0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4bf0: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4c00: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4c10: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4c20: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4c30: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4c40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4c50: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4c60: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4c70: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4c80: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4c90: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4ca0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4cb0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4cc0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4cd0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4ce0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4cf0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4d00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4d10: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4d20: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4d30: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4d40: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4d50: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4d60: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4d70: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4d80: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4d90: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4da0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4db0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4dc0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4dd0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4de0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4df0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4e00: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4e10: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4e20: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4e30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4e40: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4e50: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4e60: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4e70: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4e80: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4e90: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4ea0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4eb0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ec0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
4ed0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
4ee0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
4ef0: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
4f00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4f10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
4f20: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
4f30: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
4f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4f50: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
4f60: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
4f70: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
4f80: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
4f90: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
4fa0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
4fb0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
4fc0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
4fd0: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
4fe0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
4ff0: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5000: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5010: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5020: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5030: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5040: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5050: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5060: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
5070: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
5080: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5090: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
50a0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
50b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
50c0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
50d0: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
50e0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
50f0: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5100: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5110: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5120: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5130: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5140: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5150: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5160: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
5170: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
5180: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
5190: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
51a0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
51b0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
51c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
51d0: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
51e0: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
51f0: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5200: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5210: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5220: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5230: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5240: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5250: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5260: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
5270: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
5280: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
5290: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52b0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
52c0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
52d0: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5300: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5310: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5330: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5340: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5350: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5360: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
5370: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
5380: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
5390: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
53a0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
53b0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
53c0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
53d0: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
53e0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
53f0: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5400: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5410: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5420: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5430: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5440: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5450: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5460: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
5470: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
5480: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5490: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
54a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
54b0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
54c0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
54d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
54e0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
54f0: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5500: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5510: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5520: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5530: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5540: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5550: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5560: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
5570: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
5580: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5590: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
55a0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
55b0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
55c0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
55d0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
55e0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
55f0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5600: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5610: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5620: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5630: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5640: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5650: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
5670: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
5680: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
5690: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
56a0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
56b0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
56c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
56d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
56e0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
56f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5700: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5710: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5720: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5730: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5740: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5750: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5760: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
5770: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
5780: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
5790: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
57a0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
57b0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
57c0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
57d0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
57e0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
57f0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5800: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5810: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5820: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5830: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5840: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5850: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5860: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
5870: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
5880: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
5890: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
58a0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
58b0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
58c0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
58d0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
58e0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
58f0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5900: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5910: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5920: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5930: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5940: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5950: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5960: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5970: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5980: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5990: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
59a0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
59b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
59c0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
59d0: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
59e0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
59f0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5a00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5a10: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5a20: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5a30: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5a40: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5a50: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5a60: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5a70: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5a80: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5a90: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5aa0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5ab0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5ac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5ad0: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5ae0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5af0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5b00: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5b10: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5b20: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5b30: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5b40: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5b50: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5b60: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5b70: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5b80: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5b90: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5ba0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5bb0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5bc0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5bd0: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5be0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5bf0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5c00: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5c10: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5c20: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5c30: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5c40: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5c50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5c60: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5c70: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5c80: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5c90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ca0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5cb0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5cc0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5cd0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5ce0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5cf0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5d00: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5d10: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5d20: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5d30: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5d40: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5d50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5d60: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5d70: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5d80: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5d90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5da0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5db0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5dc0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5dd0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5de0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5df0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5e00: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5e10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5e20: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5e30: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5e50: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5e60: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5e70: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5e80: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5e90: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ec0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
5ef0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
5f00: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
5f10: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
5f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
5f30: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
5f40: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
5f50: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
5f60: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
5f70: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
5f80: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
5f90: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
5fa0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5fc0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
5fd0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
5fe0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5ff0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6000: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6010: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6020: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6030: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6040: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6050: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6060: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
6070: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
6080: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
6090: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
60a0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
60b0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
60c0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
60d0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
60e0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
60f0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6100: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6110: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6120: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6130: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6140: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6150: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6160: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
6190: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
61a0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
61b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
61c0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
61d0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
61e0: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
61f0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6200: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6210: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6220: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6230: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6240: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6250: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6260: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
6270: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6280: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
6290: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
62a0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
62b0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
62c0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
62d0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
62e0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
62f0: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6300: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6310: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6320: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6330: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6350: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6360: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
6370: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
6380: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6390: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
63a0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
63b0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
63c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
63d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
63e0: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
63f0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6400: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6410: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6420: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6430: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6440: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6450: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
6470: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
6480: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6520: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6530: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6540: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6550: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6560: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6570: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
6580: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
6590: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
65a0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
65b0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
65c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
65d0: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
65e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
65f0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6600: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6610: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6620: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6630: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6640: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6650: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6660: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
6670: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
6680: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6690: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
66a0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
66b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
66c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
66d0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
66e0: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
66f0: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6700: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6710: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6720: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6730: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6740: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6750: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6760: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
6770: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
6780: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
6790: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
67a0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
67b0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
67c0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
67d0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
67e0: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
67f0: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6800: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6810: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6820: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6830: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6840: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6850: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6860: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
6870: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
6880: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
6890: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
68a0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
68b0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
68c0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
68d0: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
68e0: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
68f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6900: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6910: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6920: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6930: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6940: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6950: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6960: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6970: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6990: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
69a0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
69b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
69c0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
69d0: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
69e0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
69f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6a00: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6a10: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6a20: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6a30: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6a40: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6a50: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6a60: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6a70: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6a80: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6a90: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6aa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6ab0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6ae0: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6af0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6b00: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6b10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6b20: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6b30: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6b40: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6b50: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6b60: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6b70: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6b80: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6b90: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6ba0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6bb0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6bc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6bd0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6be0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6c00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6c10: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6c20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6c30: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6c40: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6c50: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6c60: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6c70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6c80: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6c90: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6ca0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6cb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6cc0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6cd0: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6ce0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6cf0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6d00: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6d10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6d20: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6d30: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6d40: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6d50: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6d60: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6d70: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6d80: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6d90: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6da0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6db0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6dc0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6dd0: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6de0: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6df0: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6e00: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6e10: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6e20: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6e30: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6e40: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6e50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6e60: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6e70: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6e80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6e90: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6ea0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6eb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ec0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
6ed0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
6ee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6ef0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6f00: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
6f10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6f30: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6f40: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
6f50: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
6f60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
6f70: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
6f80: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
6f90: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
6fa0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
6fb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
6fc0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
6fd0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
6fe0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
6ff0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7000: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7010: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7020: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7030: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7040: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7050: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7060: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
7070: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
7080: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
7090: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
70a0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
70b0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
70c0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
70d0: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
70e0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
70f0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7100: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7110: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7120: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7130: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7140: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7150: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7160: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
7170: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
7180: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
7190: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
71a0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
71b0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
71c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
71f0: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7200: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7210: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7220: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7230: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7240: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7250: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7260: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
7270: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
7280: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
7290: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
72c0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
72d0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
72e0: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7310: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7320: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7330: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7340: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7350: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7360: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
7370: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7380: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
7390: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
73a0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
73b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
73c0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
73d0: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
73e0: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
73f0: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7400: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7410: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7420: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7430: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7440: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7450: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7460: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
7470: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
7480: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
7490: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
74a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
74b0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
74c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
74d0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
74e0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
74f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7500: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7510: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7520: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7530: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7540: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7550: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
7560: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7570: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7580: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
7590: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
75a0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
75b0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
75c0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
75d0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
75e0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
75f0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
7600: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
7610: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
7620: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
7630: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
7640: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
7650: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
7660: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
7670: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
7680: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
7690: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
76a0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
76b0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
76c0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
76d0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
76e0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
76f0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
7700: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
7710: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
7720: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
7730: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7740: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
7750: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
7760: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
7770: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
7780: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
7790: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
77a0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
77b0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
77c0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
77d0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
77e0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
77f0: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
7800: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
7810: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
7820: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
7830: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
7840: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
7850: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
7860: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
7870: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
7880: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
7890: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
78a0: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
78b0: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
78c0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
78d0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
78e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
78f0: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
7900: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
7910: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
7920: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
7930: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
7940: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
7950: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
7970: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
7980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
7990: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
79a0: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
79b0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
79c0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
79d0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
79e0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
79f0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
7a00: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7a10: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
7a20: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
7a30: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
7a40: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
7a50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7a60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
7a70: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
7a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
7a90: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7aa0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7ab0: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
7ac0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
7ad0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
7ae0: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
7af0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
7b00: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
7b10: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
7b20: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7b30: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7b40: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7b50: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
7b60: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7b70: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
7b80: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
7b90: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7ba0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7bb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
7bc0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
7bd0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
7be0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
7bf0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
7c00: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
7c10: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7c20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7c30: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
7c40: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
7c50: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
7c60: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7c70: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7c80: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7c90: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
7ca0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
7cb0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
7cc0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
7cd0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
7ce0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
7cf0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
7d00: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
7d10: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
7d20: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
7d30: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
7d40: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
7d50: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
7d60: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
7d70: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
7d80: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
7d90: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
7da0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
7db0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7dc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
7dd0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
7de0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
7df0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
7e00: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
7e10: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
7e20: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
7e30: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
7e40: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
7e50: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
7e60: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
7e70: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
7e80: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
7e90: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
7ea0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
7eb0: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
7ec0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
7ed0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
7ee0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
7ef0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7f00: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
7f10: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
7f20: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
7f30: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
7f40: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
7f50: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
7f60: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
7f70: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
7f80: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
7f90: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
7fa0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
7fb0: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
7fc0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
7fd0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
7fe0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
7ff0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
8000: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
8010: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
8020: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
8030: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
8040: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
8050: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
8060: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
8070: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
8080: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
8090: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
80a0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
80b0: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
80c0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
80d0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
80e0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
80f0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
8100: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
8110: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
8120: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
8130: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
8140: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
8150: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
8160: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
8170: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
8180: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
8190: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
81a0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
81b0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
81c0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
81d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
81e0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
81f0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
8200: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
8210: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
8220: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
8230: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
8240: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8250: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
8260: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
8270: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8280: 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Off);.    pPager
8290: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
82a0: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
82b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
82c0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
82d0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
82e0: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
82f0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
8300: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
8310: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
8320: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
8330: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
8340: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
8350: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
8360: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
8370: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
8380: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
8390: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
83a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
83b0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
83c0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
83d0: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
83e0: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
83f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8400: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
8410: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
8420: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
8430: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
8440: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
8450: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
8460: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
8470: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
8480: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
8490: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
84a0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
84b0: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
84c0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
84d0: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
84e0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
84f0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
8500: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
8510: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8520: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
8530: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
8540: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
8550: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
8560: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
8570: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
8580: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
8590: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
85a0: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
85b0: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
85c0: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
85d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
85e0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
85f0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
8600: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
8610: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8620: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8630: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
8640: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
8650: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8660: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
8670: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
8680: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
8690: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
86a0: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
86b0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
86c0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86e0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
86f0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
8700: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
8710: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
8720: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8730: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
8740: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8750: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
8760: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
8770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8780: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
8790: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
87a0: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
87b0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
87c0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
87d0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
87e0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
87f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
8800: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
8810: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
8820: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
8830: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
8840: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
8850: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8860: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
8870: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
8880: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
8890: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
88a0: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
88b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
88c0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
88d0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
88e0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
88f0: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
8900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8910: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
8920: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8930: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8940: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8950: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8960: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
8970: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
8980: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
8990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
89a0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
89b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
89c0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
89d0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
89e0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
89f0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
8a00: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
8a10: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
8a20: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
8a30: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
8a40: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
8a50: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
8a60: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
8a70: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
8a80: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
8a90: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
8aa0: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
8ab0: 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  d..  */.  rc = s
8ac0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
8ad0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
8ae0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
8af0: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66  , iHdrOff);.  if
8b00: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
8b10: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
8b20: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8b30: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
8b40: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
8b50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8b60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8b70: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
8b80: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
8b90: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
8ba0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
8bb0: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
8bc0: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
8bd0: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
8be0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
8bf0: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
8c00: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
8c10: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
8c20: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
8c30: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
8c40: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
8c50: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
8c60: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8c70: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8c80: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
8c90: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8ca0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8cb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8cc0: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
8cd0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
8ce0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8cf0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8d00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8d10: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
8d20: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
8d30: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
8d40: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8d50: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
8d60: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d80: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
8d90: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
8da0: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
8db0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8dc0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
8dd0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
8de0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
8df0: 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a      u16 iPageSiz
8e00: 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20  e16;            
8e10: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67   /* Copy of iPag
8e20: 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20  eSize in 16-bit 
8e30: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
8e40: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
8e50: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
8e60: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
8e70: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
8e80: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8e90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8ea0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8eb0: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
8ec0: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
8ed0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8ee0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8ef0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8f00: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
8f10: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
8f20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8f30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
8f40: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
8f50: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
8f60: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
8f70: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f80: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
8f90: 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
8fa0: 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
8fb0: 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
8fc0: 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
8fd0: 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
8fe0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
8ff0: 74 6f 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20  to 512, and not 
9000: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
9010: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
9020: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
9030: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
9040: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
9050: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
9080: 35 31 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  512.     || iPag
9090: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
90a0: 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
90b0: 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
90c0: 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
90d0: 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
90e0: 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
90f0: 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
9100: 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
9110: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
9120: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
9130: 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
9140: 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
9150: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
9160: 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
9170: 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
9180: 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
9190: 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
91a0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
91b0: 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
91c0: 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
91d0: 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
91e0: 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
91f0: 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
9200: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
9210: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
9220: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9240: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
9250: 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
9260: 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
9270: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
9280: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
9290: 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
92a0: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
92b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
92c0: 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
92d0: 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
92e0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
92f0: 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
9300: 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69    */.    iPageSi
9310: 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50 61 67  ze16 = (u16)iPag
9320: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
9330: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
9340: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
9350: 26 69 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20  &iPageSize16);. 
9360: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
9370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9380: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9390: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65  LITE_OK || iPage
93a0: 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61  Size16==(u16)iPa
93b0: 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
93c0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
93d0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
93e0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
93f0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
9400: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
9410: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
9420: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
9430: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
9440: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
9450: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
9460: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
9470: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
9480: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
9490: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
94a0: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
94b0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
94c0: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
94d0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
94e0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
94f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
9500: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
9510: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
9520: 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
9530: 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
9540: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9550: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
9560: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
9570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
9580: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
9590: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
95a0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
95b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
95c0: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
95d0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
95e0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
95f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9600: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
9610: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
9620: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
9630: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
9640: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
9650: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
9660: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
9670: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9680: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
9690: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
96a0: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
96b0: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
96c0: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
96d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
96e0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
96f0: 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
9700: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
9710: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
9720: 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
9730: 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
9740: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9750: 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
9760: 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
9770: 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
9780: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
9790: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
97a0: 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
97b0: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
97c0: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
97d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
97e0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
97f0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
9800: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
9810: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
9820: 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
9830: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
9840: 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
9850: 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
9860: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
9870: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
9880: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
9890: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
98a0: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
98b0: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
98c0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
98d0: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
98e0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
98f0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
9900: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
9910: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9930: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9940: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9970: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
9980: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
99b0: 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
99c0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
99d0: 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99f0: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
9a00: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
9a10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
9a20: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9a30: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
9a40: 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
9a50: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d  er */..  if( !zM
9a60: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
9a70: 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c  >setMaster.   ||
9a80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9aa0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9ab0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
9ac0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9ad0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ae0: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
9af0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9b00: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
9b10: 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
9b20: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
9b30: 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
9b40: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
9b50: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
9b60: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
9b70: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
9b80: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
9b90: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
9ba0: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
9bb0: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
9bc0: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
9bd0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
9be0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
9bf0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
9c00: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
9c10: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
9c20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9c30: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
9c40: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
9c50: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
9c60: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
9c70: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
9c80: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
9c90: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
9ca0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
9cb0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9cc0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
9cd0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
9ce0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
9cf0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9d00: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
9d10: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9d20: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
9d30: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
9d40: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
9d50: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9d60: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
9d70: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
9d80: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
9d90: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
9da0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9db0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
9dc0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
9dd0: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
9de0: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
9df0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9e00: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
9e10: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
9e20: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
9e30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9e40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9e50: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9e60: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
9e70: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
9e80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
9e90: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9ea0: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
9eb0: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
9ec0: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
9ed0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9ee0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
9ef0: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
9f00: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
9f10: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9f20: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
9f30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9f40: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
9f50: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9f60: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
9f70: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
9f80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
9f90: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
9fa0: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
9fb0: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
9fc0: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
9fd0: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
9fe0: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
9ff0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
a000: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
a010: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
a020: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
a030: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
a040: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
a050: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
a060: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
a070: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
a080: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
a090: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
a0a0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a0b0: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
a0c0: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
a0d0: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
a0e0: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
a0f0: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
a100: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
a110: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
a120: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
a130: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
a140: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
a150: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
a160: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
a170: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a180: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
a190: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
a1a0: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
a1b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
a1c0: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
a1d0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a1e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
a1f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
a200: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a210: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
a220: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
a230: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
a240: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
a250: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
a260: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
a270: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
a280: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
a290: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
a2a0: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
a2b0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
a2c0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
a2d0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
a2e0: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
a2f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a310: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
a320: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
a330: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
a340: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
a350: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
a360: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
a370: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
a380: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
a390: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
a3a0: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
a3b0: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
a3c0: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
a3d0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
a3e0: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
a3f0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
a400: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
a410: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a420: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
a430: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
a440: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
a450: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a460: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
a470: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
a480: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
a490: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
a4a0: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
a4b0: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
a4c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a4d0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
a4e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
a4f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
a500: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
a510: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
a520: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
a530: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
a540: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
a550: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
a560: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
a570: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
a580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
a590: 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
a5a0: 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
a5b0: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
a5c0: 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
a5d0: 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
a5e0: 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
a5f0: 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
a600: 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
a610: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
a620: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
a630: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
a640: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
a650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a660: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
a670: 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
a680: 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
a690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a6a0: 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
a6b0: 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
a6c0: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
a6d0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
a6e0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a6f0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
a700: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
a710: 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
a720: 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
a730: 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
a740: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
a750: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
a760: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
a770: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
a780: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a790: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
a7a0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
a7b0: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
a7c0: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
a7d0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a7e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a7f0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
a800: 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
a810: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
a820: 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
a830: 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
a840: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
a850: 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
a860: 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
a870: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
a880: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
a890: 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
a8a0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
a8b0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
a8c0: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
a8d0: 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
a8e0: 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
a8f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a900: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
a910: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
a920: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a930: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
a940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a950: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
a960: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
a970: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a980: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a990: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
a9a0: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
a9b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a9c0: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
a9d0: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
a9e0: 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
a9f0: 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
aa00: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
aa10: 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
aa20: 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
aa30: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
aa40: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
aa50: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
aa60: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
aa70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
aa80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
aa90: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
aaa0: 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ile. This functi
aab0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
aac0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73   the pager.** is
aad0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
aae0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
aaf0: 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
ab00: 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61  tly in error sta
ab10: 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  te, discard the 
ab20: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20  contents of .** 
ab30: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
ab40: 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74  set the Pager st
ab50: 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c  ructure internal
ab60: 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65   state. If there
ab70: 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a   is.** an open j
ab80: 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65  ournal-file, the
ab90: 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  n the next time 
aba0: 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
abb0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
abc0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28  the pager file (
abd0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
abe0: 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69  ther process), i
abf0: 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65  t will be.** tre
ac00: 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  ated as a hot-jo
ac10: 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
ac20: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
ac30: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
ac40: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
ac50: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
ac60: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
ac70: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
aca0: 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c  de */..    /* Al
acb0: 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a  ways close the j
acc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
acd0: 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61   dropping the da
ace0: 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20  tabase lock..   
acf0: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
ad00: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
ad10: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
ad20: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
ad30: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74  .    ** delete t
ad40: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
ad50: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a   under us..    *
ad60: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  /.    sqlite3OsC
ad70: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
ad80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
ad90: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
ada0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
adb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
adc0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
add0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
ade0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
adf0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
ae00: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
ae10: 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69  somebody else mi
ae20: 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54  ght change it. T
ae30: 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
ae40: 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
ae50: 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67  .dbSize etc. mig
ae60: 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  ht become invali
ae70: 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  d if.    ** this
ae80: 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f 3a 20   happens. TODO: 
ae90: 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65  Really, this doe
aea0: 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20  sn't need to be 
aeb0: 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75  cleared.    ** u
aec0: 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d  ntil the change-
aed0: 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61  counter check fa
aee0: 69 6c 73 20 69 6e 20 70 61 67 65 72 53 68 61 72  ils in pagerShar
aef0: 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  edLock()..    */
af00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
af10: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20  izeValid = 0;.. 
af20: 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b     rc = osUnlock
af30: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
af40: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
af50: 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
af60: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
af70: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
af80: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
af90: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
afa0: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
afb0: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
afc0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
afd0: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
afe0: 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72  not be.    ** tr
aff0: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
b000: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
b010: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
b020: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
b030: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
b040: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
b050: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
b060: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
b070: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b080: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b090: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
b0a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b0b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b0c0: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
b0d0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b0e0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
b0f0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
b100: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
b110: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
b120: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
b130: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
b140: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b150: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
b160: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
b170: 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52 55   an IOERR, CORRU
b180: 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  PT or FULL error
b190: 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f 63 63  .** may have occ
b1a0: 75 72 72 65 64 2e 20 54 68 65 20 66 69 72 73 74  urred. The first
b1b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
b1c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b1d0: 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  ger .** structur
b1e0: 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68  e, the second th
b1f0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
b200: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
b210: 64 20 62 79 20 61 20 70 61 67 65 72 20 0a 2a 2a  d by a pager .**
b220: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
b230: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
b240: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
b250: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b260: 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  nt .** to this f
b270: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
b280: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
b290: 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
b2a0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
b2b0: 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
b2c0: 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
b2d0: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
b2e0: 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
b2f0: 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f  e persisten erro
b300: 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a  r is cleared,.**
b310: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
b320: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
b330: 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
b340: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
b350: 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63  same .** error c
b360: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72  ode..**.** A per
b370: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e  sistent error in
b380: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
b390: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b3a0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
b3b0: 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
b3c0: 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
b3d0: 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
b3e0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
b3f0: 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
b400: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
b410: 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
b420: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
b430: 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
b440: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
b450: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
b460: 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
b470: 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
b480: 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
b490: 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
b4a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b4b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b4c0: 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
b4d0: 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
b4e0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
b4f0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
b500: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b510: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
b520: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
b530: 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
b540: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
b550: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b560: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b570: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
b580: 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
b590: 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
b5a0: 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
b5b0: 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72    );.  if(.    r
b5c0: 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
b5d0: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
b5e0: 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
b5f0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52  rc2==SQLITE_CORR
b600: 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61  UPT.  ){.    pPa
b610: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
b620: 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  c;.    if( pPage
b630: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
b640: 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20  UNLOCK .     && 
b650: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
b660: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
b670: 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
b680: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
b690: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
b6a0: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
b6b0: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
b6c0: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
b6d0: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
b6e0: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
b6f0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
b700: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
b710: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
b720: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
b730: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
b740: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
b750: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
b770: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
b780: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
b790: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
b7a0: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
b7b0: 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
b7c0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
b7d0: 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
b7e0: 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
b7f0: 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
b800: 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
b810: 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
b820: 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
b830: 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
b840: 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
b850: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
b860: 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
b870: 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
b880: 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
b890: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b8a0: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65   and clear the e
b8b0: 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74  rror state. If t
b8c0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  his means that.*
b8d0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  * there is a hot
b8e0: 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
b8f0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
b900: 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65  , the next conne
b910: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61  ction.** to obta
b920: 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
b930: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
b940: 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
b950: 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f   one) will.** ro
b960: 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
b970: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
b980: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
b990: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
b9a0: 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
b9b0: 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
b9c0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
b9d0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
b9e0: 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
b9f0: 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
ba00: 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
ba10: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
ba20: 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
ba30: 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
ba40: 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
ba50: 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
ba60: 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
ba70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
ba80: 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
ba90: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
baa0: 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
bab0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
bac0: 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
bad0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
bae0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
baf0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
bb00: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
bb10: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
bb20: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
bb30: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
bb40: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
bb50: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
bb60: 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ger);.}../*.** T
bb70: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
bb80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
bb90: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
bba0: 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
bbb0: 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
bbc0: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
bbd0: 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
bbe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
bbf0: 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
bc00: 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
bc10: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
bc20: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
bc30: 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
bc40: 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
bc50: 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
bc60: 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
bc70: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
bc80: 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
bc90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
bca0: 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
bcb0: 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48  r is in PAGER_SH
bcc0: 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e  ARED or PAGER_UN
bcd0: 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20  LOCK state when 
bce0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
bcf0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
bd00: 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e   a no-op (return
bd10: 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  s SQLITE_OK)..**
bd20: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
bd30: 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  ny active savepo
bd40: 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65  ints are release
bd50: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
bd60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
bd70: 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73  open, then it is
bd80: 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e   "finalized". On
bd90: 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ce a journal .**
bda0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66   file has been f
bdb0: 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e  inalized it is n
bdc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
bdd0: 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61  se it to roll ba
bde0: 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63  ck a .** transac
bdf0: 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69  tion. Nor will i
be00: 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  t be considered 
be10: 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72  to be a hot-jour
be20: 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f  nal by this.** o
be30: 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  r any other data
be40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
be50: 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a   Exactly how a j
be60: 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
be70: 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f  zed.** depends o
be80: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
be90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
bea0: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
beb0: 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74  ve mode and.** t
bec0: 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e  he current journ
bed0: 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a  al-mode (Pager.j
bee0: 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65  ournalMode value
bef0: 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ), as follows:.*
bf00: 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
bf10: 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  de==MEMORY.**   
bf20: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64    Journal file d
bf30: 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d  escriptor is sim
bf40: 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  ply closed. This
bf50: 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a   destroys an .**
bf60: 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a       in-memory j
bf70: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20  ournal..**.**   
bf80: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55  journalMode==TRU
bf90: 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75  NCATE.**     Jou
bfa0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75  rnal file is tru
bfb0: 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62  ncated to zero b
bfc0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
bfd0: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
bfe0: 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  e==PERSIST.**   
bff0: 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62    The first 28 b
c000: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
c010: 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72  nal file are zer
c020: 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69  oed. This invali
c030: 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65  dates.**     the
c040: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
c050: 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c  eader in the fil
c060: 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  e, and hence the
c070: 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a   entire journal.
c080: 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20  **     file. An 
c090: 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  invalid journal 
c0a0: 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  file cannot be r
c0b0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
c0c0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
c0d0: 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54  =DELETE.**     T
c0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0f0: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  is closed and de
c100: 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  leted using sqli
c110: 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
c120: 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20  *.**     If the 
c130: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
c140: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c150: 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20  de, this method 
c160: 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a  of finalizing.**
c170: 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
c180: 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75   file is never u
c190: 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66  sed. Instead, if
c1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65   the journalMode
c1b0: 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54   is.**     DELET
c1c0: 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  E and the pager 
c1d0: 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
c1e0: 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64  mode, the method
c1f0: 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
c200: 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d  .**     journalM
c210: 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20  ode==PERSIST is 
c220: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
c230: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f  .** After the jo
c240: 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
c250: 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69  ed, if running i
c260: 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20  n non-exclusive 
c270: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67  mode, the.** pag
c280: 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45  er moves to PAGE
c290: 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 28  R_SHARED state (
c2a0: 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74  and downgrades t
c2b0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a  he lock on the.*
c2c0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
c2d0: 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a  accordingly)..**
c2e0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
c2f0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
c300: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
c310: 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59  d is in PAGER_SY
c320: 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69  NCED state,.** i
c330: 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  t moves to PAGER
c340: 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c  _EXCLUSIVE. No l
c350: 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61  ocks are downgra
c360: 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ded when running
c370: 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65   in.** exclusive
c380: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   mode..**.** SQL
c390: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
c3a0: 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
c3b0: 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
c3c0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
c3d0: 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49  .** any of the I
c3e0: 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  O operations to 
c3f0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
c400: 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c  rnal file or unl
c410: 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ock the.** datab
c420: 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ase then the IO 
c430: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
c440: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
c450: 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f  er. If the .** o
c460: 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61  peration to fina
c470: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
c480: 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65   file fails, the
c490: 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c  n the code still
c4a0: 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c  .** tries to unl
c4b0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
c4c0: 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20   file if not in 
c4d0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20  exclusive mode. 
c4e0: 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b  If the.** unlock
c4f0: 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73   operation fails
c500: 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74   as well, then t
c510: 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63  he first error c
c520: 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74  ode related.** t
c530: 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  o the first erro
c540: 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74  r encountered (t
c550: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  he journal final
c560: 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a  ization one) is.
c570: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
c580: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c590: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
c5a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c5b0: 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a  int hasMaster){.
c5c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5d0: 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
c5e0: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
c5f0: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
c600: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
c610: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
c620: 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
c630: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
c640: 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
c650: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ration */..  if(
c660: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
c670: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
c680: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c690: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c  TE_OK;.  }.  rel
c6a0: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
c6b0: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73  s(pPager);..  as
c6c0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c6d0: 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
c6e0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
c6f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
c700: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
c710: 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ){..    /* TODO:
c720: 20 54 68 65 72 65 27 73 20 61 20 70 72 6f 62 6c   There's a probl
c730: 65 6d 20 68 65 72 65 20 69 66 20 61 20 6a 6f 75  em here if a jou
c740: 72 6e 61 6c 2d 66 69 6c 65 20 77 61 73 20 6f 70  rnal-file was op
c750: 65 6e 65 64 20 69 6e 20 4d 45 4d 4f 52 59 0a 20  ened in MEMORY. 
c760: 20 20 20 2a 2a 20 6d 6f 64 65 20 61 6e 64 20 74     ** mode and t
c770: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  hen the journal-
c780: 6d 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  mode is changed 
c790: 74 6f 20 54 52 55 4e 43 41 54 45 20 6f 72 20 50  to TRUNCATE or P
c7a0: 45 52 53 49 53 54 0a 20 20 20 20 2a 2a 20 64 75  ERSIST.    ** du
c7b0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
c7c0: 74 69 6f 6e 2e 20 54 68 69 73 20 63 6f 64 65 20  tion. This code 
c7d0: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
c7e0: 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20 20 20  d to assume.    
c7f0: 2a 2a 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ** that the jour
c800: 6e 61 6c 20 6d 6f 64 65 20 68 61 73 20 6e 6f 74  nal mode has not
c810: 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74   changed since t
c820: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
c830: 61 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 65  as.    ** starte
c840: 64 2e 20 41 6e 64 20 74 68 65 20 73 71 6c 69 74  d. And the sqlit
c850: 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
c860: 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 73 68  de() function sh
c870: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
c880: 68 61 6e 67 65 64 20 74 6f 20 6d 61 6b 65 20 73  hanged to make s
c890: 75 72 65 20 74 68 61 74 20 74 68 69 73 20 69 73  ure that this is
c8a0: 20 74 68 65 20 63 61 73 65 20 74 6f 6f 2e 0a 20   the case too.. 
c8b0: 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69     */..    /* Fi
c8c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c8d0: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
c8e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
c8f0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
c900: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
c910: 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y ){.      int i
c920: 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d  sMemoryJournal =
c930: 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
c940: 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
c950: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c960: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
c970: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
c980: 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c  !isMemoryJournal
c990: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c9a0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c9b0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
c9c0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
c9d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c9e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
c9f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
ca00: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ca10: 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  E_TRUNCATE ){.  
ca20: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ca30: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
ca40: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ca50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
ca60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
ca70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
ca80: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
ca90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
caa0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cab0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
cac0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cad0: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
cae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
caf0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
cb00: 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  e .     || pPage
cb10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
cb20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
cb30: 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b  E_PERSIST.    ){
cb40: 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
cb50: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
cb60: 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
cb70: 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
cb80: 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
cb90: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cba0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
cbb0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cbc0: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
cbd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
cbe0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
cbf0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cc00: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
cc10: 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20  LETE || rc );.  
cc20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cc30: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
cc40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
cc50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
cc60: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
cc70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cc80: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
cc90: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
cca0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
ccb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ccc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
ccd0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
cce0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
ccf0: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
cd00: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
cd10: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
cd20: 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
cd30: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
cd40: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
cd50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
cd60: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
cd70: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
cd80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
cd90: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
cda0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
cdb0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  0;.  }..  if( !p
cdc0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cdd0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
cde0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
cdf0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
ce00: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
ce10: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
ce20: 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65  HARED;.    pPage
ce30: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
ce40: 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ne = 0;.  }else 
ce50: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
ce60: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
ce70: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
ce80: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
ce90: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
cea0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
ceb0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
cec0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
ced0: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
cee0: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44  d = 0;..  /* TOD
cef0: 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d  O: Is this optim
cf00: 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65 20 64  al? Why is the d
cf10: 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74  b size invalidat
cf20: 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68  ed here .  ** wh
cf30: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
cf40: 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f  file is not unlo
cf50: 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65  cked? */.  pPage
cf60: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
cf70: 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
cf80: 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
cf90: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
cfa0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
cfb0: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
cfc0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
cfd0: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  alid = 0;.  }.. 
cfe0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
cff0: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
d000: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
d010: 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
d020: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
d030: 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
d040: 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
d050: 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
d060: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
d070: 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
d080: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
d090: 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
d0a0: 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
d0b0: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
d0c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
d0d0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
d0e0: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
d0f0: 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
d100: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d110: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d120: 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
d130: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
d140: 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
d150: 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
d160: 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
d170: 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
d180: 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
d190: 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
d1a0: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
d1b0: 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
d1c0: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
d1d0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
d1e0: 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
d1f0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
d200: 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
d210: 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
d220: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
d230: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
d240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
d250: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
d260: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
d270: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
d280: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
d290: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
d2a0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
d2b0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
d2c0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
d2d0: 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
d2e0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
d2f0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
d300: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
d310: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
d320: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
d330: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
d340: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
d350: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
d360: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
d370: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
d380: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
d390: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
d3a0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
d3b0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
d3c0: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
d3d0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
d3e0: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
d3f0: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
d400: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
d410: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
d420: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
d430: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
d440: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
d450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
d460: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d470: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
d480: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
d490: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
d4a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d4b0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
d4c0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
d4d0: 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
d4e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d4f0: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
d500: 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
d510: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
d520: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
d530: 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
d540: 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
d550: 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
d560: 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
d570: 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
d580: 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
d590: 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
d5a0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
d5b0: 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
d5c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
d5d0: 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a  *.** The isMainJ
d5e0: 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  rnl flag is true
d5f0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
d600: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
d610: 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c  urnal and.** fal
d620: 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  se for the state
d630: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
d640: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d650: 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a   journal uses.**
d660: 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
d670: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d680: 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a  al does not..**.
d690: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
d6a0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
d6b0: 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
d6c0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d6d0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
d6e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d6f0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
d700: 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
d710: 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
d720: 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
d730: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
d740: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
d750: 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
d760: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
d770: 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
d780: 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
d790: 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
d7a0: 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
d7b0: 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
d7c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
d7d0: 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
d7e0: 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
d7f0: 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
d800: 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
d810: 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
d820: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
d830: 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
d840: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
d850: 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
d860: 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
d870: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
d880: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
d890: 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
d8a0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
d8b0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d8c0: 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
d8d0: 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
d8e0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
d8f0: 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
d900: 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
d910: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
d920: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
d930: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d940: 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
d950: 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
d960: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
d970: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
d980: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d990: 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
d9a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
d9b0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d9c0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
d9d0: 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
d9e0: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
d9f0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
da00: 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
da10: 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
da20: 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
da30: 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
da40: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
da50: 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
da60: 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
da70: 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
da80: 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
da90: 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
daa0: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
dab0: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
dac0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
dad0: 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
dae0: 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
daf0: 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
db00: 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
db10: 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
db20: 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
db30: 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
db40: 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
db50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
db60: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
db70: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
db80: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
db90: 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
dba0: 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
dbb0: 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
dbc0: 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
dbd0: 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
dbe0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
dbf0: 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
dc00: 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
dc10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dc20: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
dc30: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
dc40: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
dc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dc60: 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
dc70: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
dc80: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
dc90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
dca0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
dcb0: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
dcc0: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e  l. */.  int isUn
dcd0: 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  sync,           
dce0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
dcf0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 75 6e   reading from un
dd00: 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75 72  synced main jour
dd10: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  nal */.  i64 *pO
dd20: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
dd30: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
dd40: 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
dd50: 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  ayback */.  int 
dd60: 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20  isSavepnt,      
dd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
dd80: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
dd90: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t rollback */.  
dda0: 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20  Bitvec *pDone   
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
ddd0: 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
dde0: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
ddf0: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
de00: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
de10: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
de20: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
de30: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
de40: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
de50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
de60: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
de70: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
de80: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
deb0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
dec0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
ded0: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
def0: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
df00: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
df10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
df20: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
df30: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
df40: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
df50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
df60: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
df70: 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
df80: 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
df90: 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
dfa0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
dfb0: 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
dfc0: 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
dfd0: 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
dfe0: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
dff0: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
e000: 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
e010: 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
e020: 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
e030: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
e040: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
e050: 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
e060: 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
e070: 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
e080: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
e090: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
e0a0: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
e0b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
e0c0: 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
e0d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
e0e0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 2f  llocated */..  /
e0f0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
e100: 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
e110: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
e120: 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
e130: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
e140: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
e150: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
e160: 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
e170: 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
e180: 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
e190: 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
e1a0: 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
e1b0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e1c0: 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
e1d0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
e1e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
e1f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
e200: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
e210: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
e220: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
e230: 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
e240: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e250: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
e260: 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
e270: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
e280: 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
e290: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
e2a0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
e2b0: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
e2c0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
e2d0: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
e2e0: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
e2f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
e300: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
e310: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
e320: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
e330: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
e340: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
e350: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e360: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
e370: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
e380: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
e390: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
e3a0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
e3b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
e3c0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
e3d0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
e3e0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
e3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
e400: 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
e410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e420: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
e430: 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
e440: 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
e450: 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
e460: 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
e470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e480: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
e490: 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
e4a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e4b0: 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
e4c0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
e4d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
e4e0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
e4f0: 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
e500: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
e510: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
e520: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e530: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
e540: 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  ..  if( pDone &&
e550: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
e560: 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
e570: 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
e580: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e590: 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
e5a0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
e5b0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
e5c0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
e5d0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
e5e0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
e5f0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
e600: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
e610: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
e620: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
e630: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
e640: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
e650: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
e660: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e670: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
e680: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e690: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e6a0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
e6b0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
e6c0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
e6d0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
e6e0: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
e6f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
e700: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
e710: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
e720: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
e730: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
e740: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
e750: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
e760: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
e770: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
e780: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
e790: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
e7a0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
e7b0: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
e7c0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
e7d0: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
e7e0: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
e7f0: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
e800: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
e810: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
e820: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
e830: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
e840: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
e850: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
e860: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
e870: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
e880: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
e890: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
e8a0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
e8b0: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
e8c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
e8d0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
e8e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e8f0: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
e900: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
e910: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
e920: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
e930: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
e940: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
e950: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
e960: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
e970: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
e980: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
e990: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
e9a0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
e9b0: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
e9c0: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
e9d0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
e9e0: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
e9f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
ea00: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
ea10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
ea20: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
ea30: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
ea40: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
ea50: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
ea60: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
ea70: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
ea80: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
ea90: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
eaa0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
eab0: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
eac0: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
ead0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
eae0: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
eaf0: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
eb00: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
eb10: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
eb20: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
eb30: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
eb40: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
eb50: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
eb60: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
eb70: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
eb80: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
eb90: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
eba0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
ebb0: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
ebc0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
ebd0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
ebe0: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
ebf0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
ec00: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
ec10: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
ec20: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
ec30: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
ec40: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
ec50: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
ec60: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
ec70: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
ec80: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
ec90: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
eca0: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
ecb0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
ecc0: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
ecd0: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
ece0: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
ecf0: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
ed00: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
ed10: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
ed20: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
ed30: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
ed40: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
ed50: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
ed60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
ed70: 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
ed80: 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
ed90: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
eda0: 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
edb0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
edc0: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
edd0: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
ede0: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
edf0: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
ee00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ee10: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
ee20: 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
ee30: 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
ee40: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
ee50: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
ee60: 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28 70  LUSIVE).   && (p
ee70: 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
ee80: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
ee90: 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20  ED_SYNC)).   && 
eea0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
eeb0: 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79  d).   && !isUnsy
eec0: 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  nc.  ){.    i64 
eed0: 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
eee0: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
eef0: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
ef00: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
ef10: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
ef20: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ef30: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
ef40: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
ef50: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
ef60: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
ef70: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
ef80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ef90: 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
efa0: 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
efb0: 6e 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 7d 65  no, aData);.  }e
efc0: 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
efd0: 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
efe0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
eff0: 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
f000: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
f010: 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
f020: 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
f030: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
f040: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f050: 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
f060: 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
f070: 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
f080: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
f090: 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
f0a0: 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
f0b0: 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
f0c0: 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
f0d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f0e0: 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
f0f0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
f100: 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
f110: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
f120: 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
f130: 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
f140: 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
f150: 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
f160: 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
f170: 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
f180: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
f190: 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
f1a0: 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
f1b0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
f1c0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
f1d0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
f1e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f1f0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
f200: 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
f210: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
f220: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
f230: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
f240: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
f250: 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
f260: 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
f270: 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
f280: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
f290: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
f2a0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
f2b0: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
f2c0: 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
f2d0: 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
f2e0: 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
f2f0: 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
f300: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
f310: 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
f320: 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
f330: 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
f340: 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
f350: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
f360: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  t );.    if( (rc
f370: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
f380: 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
f390: 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d  gno, &pPg, 1))!=
f3a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f3b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f3c0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61    }.    pPg->fla
f3d0: 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
f3e0: 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
f3f0: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
f400: 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
f410: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
f420: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
f430: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
f440: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
f450: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
f460: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
f470: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
f480: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
f490: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
f4a0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
f4b0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
f4c0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
f4d0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
f4e0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
f4f0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
f500: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
f510: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
f520: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
f530: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
f540: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
f550: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
f560: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
f570: 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
f580: 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
f590: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
f5a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f5b0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
f5c0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
f5d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
f5e0: 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
f5f0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69   }.    if( isMai
f600: 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
f610: 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
f620: 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
f630: 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
f640: 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
f650: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
f660: 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
f670: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
f680: 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
f690: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
f6a0: 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
f6b0: 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
f6c0: 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
f6d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f6e0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
f6f0: 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
f700: 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
f710: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
f720: 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
f730: 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
f740: 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
f750: 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a  to the..      **
f760: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
f770: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
f780: 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
f790: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
f7a0: 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
f7b0: 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
f7c0: 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
f7d0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
f7e0: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
f7f0: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
f800: 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
f810: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
f820: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
f830: 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
f840: 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
f850: 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
f860: 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
f870: 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
f880: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
f890: 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
f8a0: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
f8b0: 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
f8c0: 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
f8d0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
f8e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
f8f0: 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
f900: 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
f910: 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
f920: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f930: 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
f940: 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
f950: 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
f960: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
f970: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
f980: 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
f990: 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
f9a0: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
f9b0: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
f9c0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
f9d0: 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
f9e0: 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
f9f0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
fa00: 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
fa10: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
fa20: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
fa30: 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
fa40: 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
fa50: 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
fa60: 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
fa70: 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
fa80: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
fa90: 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
faa0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fab0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
fac0: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
fad0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
fae0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
faf0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
fb00: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
fb10: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
fb20: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
fb30: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
fb40: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
fb50: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
fb60: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
fb70: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
fb80: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
fb90: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
fba0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
fbb0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
fbc0: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
fbd0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
fbe0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
fbf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fc00: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
fc10: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
fc20: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
fc30: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
fc40: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
fc50: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
fc60: 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
fc70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fc80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
fc90: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
fca0: 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
fcb0: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _TEST)./*.** Thi
fcc0: 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
fcd0: 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d  ahead into the m
fce0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
fcf0: 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a   and determines.
fd00: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
fd10: 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  t the next recor
fd20: 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74 68  d (the record th
fd30: 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c  at begins at fil
fd40: 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67  e.** offset pPag
fd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
fd60: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
fd70: 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e   page record con
fd80: 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20  sisting.** of a 
fd90: 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
fda0: 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69  r, pPage->pageSi
fdb0: 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  ze bytes of cont
fdc0: 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a  ent, followed.**
fdd0: 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65 63   by a valid chec
fde0: 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ksum..**.** The 
fdf0: 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64  pager never need
fe00: 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69  s to know this i
fe10: 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74  n order to do it
fe20: 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a  s job.   This.**
fe30: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
fe40: 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68 20   used from with 
fe50: 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73  assert() and tes
fe60: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a  tcase() macros..
fe70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
fe80: 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
fe90: 67 65 49 73 56 61 6c 69 64 28 50 61 67 65 72 20  geIsValid(Pager 
fea0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f  *pPager){.  Pgno
feb0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
fec0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
fed0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
fee0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
fef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ff00: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a   page checksum *
ff10: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
ff20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ff30: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61  rn code from rea
ff40: 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  d operations */.
ff50: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
ff60: 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69  fd;    /* The fi
ff70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 72  le descriptor fr
ff80: 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72 65 20  om which we are 
ff90: 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20  reading */.  u8 
ffa0: 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
ffb0: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
ffc0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f  the page */..  /
ffd0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
ffe0: 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f  number header */
fff0: 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e  .  fd = pPager->
10000 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
10010 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65  32bits(fd, pPage
10020 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26  r->journalOff, &
10030 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
10040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65  =SQLITE_OK ){ re
10050 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
10080 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e  TEST*/.  if( pgn
10090 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
100a0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
100b0 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  er) ){ return 0;
100c0 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f   }         /*NO_
100d0 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e  TEST*/.  if( pgn
100e0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
100f0 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e  dbSize ){ return
10100 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
10110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
10120 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  TEST*/..  /* Rea
10130 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a  d the checksum *
10140 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  /.  rc = read32b
10150 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e  its(fd, pPager->
10160 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65  journalOff+pPage
10170 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26  r->pageSize+4, &
10180 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
10190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72  !=SQLITE_OK ){ r
101a0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
101d0 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65  _TEST*/..  /* Re
101e0 61 64 20 74 68 65 20 64 61 74 61 20 61 6e 64 20  ad the data and 
101f0 76 65 72 69 66 79 20 74 68 65 20 63 68 65 63 6b  verify the check
10200 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d  sum */.  aData =
10210 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54   (u8*)pPager->pT
10220 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
10230 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
10240 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
10250 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65  >pageSize, pPage
10260 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29  r->journalOff+4)
10270 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10280 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
10290 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
102c0 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b  /.  if( pager_ck
102d0 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
102e0 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74  a)!=cksum ){ ret
102f0 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
10300 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
10310 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68  /..  /* Reach th
10320 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66  is point only if
10330 20 74 68 65 20 70 61 67 65 20 69 73 20 76 61 6c   the page is val
10340 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  id */.  return 1
10350 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
10360 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
10370 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
10380 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20  _COVERAGE_TEST) 
10390 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  */../*.** Parame
103a0 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
103b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
103c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
103d0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
103e0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
103f0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
10400 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10410 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
10420 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
10430 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
10440 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
10450 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
10460 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10470 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
10480 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
10490 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
104a0 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
104b0 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
104c0 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
104d0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
104e0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
104f0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
10500 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
10510 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
10520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
10530 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
10540 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
10550 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
10560 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
10570 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
10580 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
10590 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
105a0 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
105b0 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
105c0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
105d0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
105e0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
105f0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
10600 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
10610 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
10620 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10630 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
10640 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
10650 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
10660 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
10670 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
10680 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
10690 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
106a0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
106b0 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
106c0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
106d0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
106e0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
106f0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
10700 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
10710 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
10720 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
10730 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
10740 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
10750 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
10760 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
10770 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
10780 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
10790 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
107a0 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
107b0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
107c0 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
107d0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
107e0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
107f0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
10800 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
10810 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
10820 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
10830 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
10840 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
10850 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
10860 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10870 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
10880 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
10890 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
108a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
108b0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
108c0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
108d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
108e0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
108f0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10900 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
10910 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
10920 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
10930 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
10940 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
10950 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
10960 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
10970 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
10980 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
10990 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
109a0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
109b0 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
109c0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
109d0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
109e0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
109f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
10a00 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
10a10 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
10a20 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
10a30 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
10a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
10a50 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
10a60 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
10a70 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
10a80 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
10a90 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
10aa0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
10ab0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ac0 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
10ad0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
10ae0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
10af0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
10b00 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
10b10 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
10b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
10b30 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
10b40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10b50 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10b60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
10b70 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
10b80 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
10bb0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
10bc0 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
10bd0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
10be0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
10bf0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
10c00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10c10 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
10c20 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
10c30 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10c40 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
10c50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
10c60 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
10c70 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10c80 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
10c90 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
10ca0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10cb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10cc0 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  file */..  /* Al
10cd0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
10ce0 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
10cf0 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
10d00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
10d10 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
10d20 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
10d30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10d40 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
10d50 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
10d60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
10d70 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10d80 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
10d90 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
10da0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
10db0 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
10dc0 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
10dd0 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
10de0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
10df0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
10e10 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
10e20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
10e30 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
10e40 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
10e50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10e60 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
10e70 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
10e80 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
10e90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10ea0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
10eb0 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63  aster_out;..  rc
10ec0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10ed0 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
10ee0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
10ef0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10f00 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
10f10 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
10f20 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
10f30 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
10f40 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
10f50 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
10f60 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74  0;.    int nMast
10f70 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
10f80 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20  Pathname+1;..   
10f90 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
10fa0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
10fb0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
10fc0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
10fd0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
10fe0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
10ff0 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
11000 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
11010 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
11020 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29  urnal = (char *)
11030 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
11040 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
11050 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  l + nMasterPtr);
11060 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
11070 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
11080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11090 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
110a0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
110b0 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72     }.    zMaster
110c0 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
110d0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
110e0 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20  rnal];.    rc = 
110f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
11100 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
11110 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
11120 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
11130 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11140 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
11150 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
11160 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
11170 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
11180 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
11190 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
111a0 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
111b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69  ){.      int exi
111c0 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sts;.      rc = 
111d0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
111e0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
111f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
11200 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
11210 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11230 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11240 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
11250 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20       if( exists 
11260 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
11270 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
11280 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
11290 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
112a0 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
112b0 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
112c0 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
112d0 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
112e0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
112f0 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
11300 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
11310 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
11320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
11330 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11340 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
11350 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
11360 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
11370 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
11380 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
11390 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
113a0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
113b0 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
113c0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
113d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
113e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
113f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
11400 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
11410 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
11420 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
11430 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
11440 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
11450 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
11460 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
11470 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
11480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11490 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
114a0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
114b0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
114c0 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
114d0 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
114e0 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
114f0 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
11500 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
11510 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
11520 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
11530 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
11540 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11550 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
11560 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11570 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
11580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
11590 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
115a0 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
115b0 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
115c0 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
115d0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
115e0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
115f0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
11600 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
11610 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
11620 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
11630 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
11640 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
11650 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11660 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
11670 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11680 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
11690 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
116a0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
116b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
116c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
116d0 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
116e0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
116f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11700 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
11710 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
11720 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
11730 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
11740 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
11750 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
11760 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
11770 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
11780 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
11790 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
117a0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
117b0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
117c0 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c  open, or an excl
117d0 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f  usive lock is no
117e0 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20  t.** held, this 
117f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11800 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
11810 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11820 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67  file is.** chang
11830 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
11840 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
11850 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
11860 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a  . If the file.**
11870 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
11880 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
11890 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
118a0 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
118b0 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
118c0 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
118d0 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
118e0 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62  it might might b
118f0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
11900 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
11910 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
11920 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
11930 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
11940 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
11950 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
11960 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
11970 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
11980 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
11990 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
119a0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
119b0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
119c0 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
119d0 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
119e0 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
119f0 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
11a00 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
11a10 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
11a20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
11a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
11a40 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
11a50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
11a60 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
11a70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
11a80 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
11a90 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ab0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
11ac0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11ad0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
11ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11af0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11b00 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
11b10 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28  USIVE && isOpen(
11b20 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
11b30 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
11b40 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
11b50 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
11b60 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
11b70 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
11b80 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
11b90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11ba0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
11bb0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
11bc0 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72  newSize = pPager
11bd0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
11be0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
11bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11c00 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
11c10 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
11c20 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
11c30 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
11c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11c50 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
11c60 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
11c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11c90 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
11ca0 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a  d, "", 1, newSiz
11cb0 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e-1);.      }.  
11cc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11ce0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
11cf0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
11d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11d20 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
11d30 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
11d40 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
11d50 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
11d60 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
11d70 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
11d80 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
11d90 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
11da0 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
11db0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
11dc0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
11dd0 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64  ill be used used
11de0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
11df0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
11e00 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
11e10 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
11e20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11e30 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
11e40 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
11e50 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
11e60 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
11e70 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
11e80 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
11e90 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
11ea0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
11eb0 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
11ec0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
11ed0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
11ee0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
11ef0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
11f00 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
11f10 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
11f20 65 64 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a  ed up to 512 if.
11f30 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
11f40 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64  an 512, or round
11f50 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
11f60 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
11f70 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
11f80 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
11f90 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IZE..*/.static v
11fa0 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
11fb0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
11fc0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
11fd0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
11fe0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
11ff0 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  le );..  if( !pP
12000 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
12010 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
12020 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
12030 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
12040 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
12050 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
12060 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
12070 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
12080 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
12090 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
120a0 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
120b0 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a  egfault..    */.
120c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
120d0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
120e0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
120f0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
12100 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12110 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20  orSize<512 ){.  
12120 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12130 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a  Size = 512;.  }.
12140 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
12150 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
12160 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
12170 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
12180 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
12190 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
121a0 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43  orSize = MAX_SEC
121b0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a  TOR_SIZE;.  }.}.
121c0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
121d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
121e0 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
121f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
12200 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
12210 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
12220 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
12230 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
12240 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
12250 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
12260 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
12270 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
12280 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
12290 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
122a0 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
122b0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
122c0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
122d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
122e0 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
122f0 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
12300 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
12310 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
12320 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
12330 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
12340 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
12350 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
12360 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
12370 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
12380 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12390 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
123a0 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
123b0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
123c0 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
123d0 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
123e0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
123f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
12400 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
12410 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
12420 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
12430 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
12440 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
12450 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12460 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
12470 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
12480 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
12490 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
124a0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
124b0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
124c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
124d0 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 63  ch is the page c
124e0 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20  ase..**  (7)  4 
124f0 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
12500 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
12510 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
12520 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
12530 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
12540 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
12550 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
12560 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
12570 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
12580 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
12590 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  8)  N bytes of t
125a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
125b0 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
125c0 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
125d0 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
125e0 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
125f0 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
12600 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
12610 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
12620 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
12630 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
12640 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
12650 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
12660 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
12670 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
12680 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
12690 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
126a0 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (9)  Zero or mor
126b0 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
126c0 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
126d0 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
126e0 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
126f0 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
12700 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
12710 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
12720 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
12730 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
12740 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
12750 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
12760 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
12770 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69 74  n the first 8 it
12780 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
12790 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
127a0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
127b0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74  stance of the 9t
127c0 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
127d0 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
127e0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
127f0 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
12800 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
12810 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
12820 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
12830 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
12840 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
12850 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
12860 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
12870 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
12880 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12890 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
128a0 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
128b0 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
128c0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
128d0 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
128e0 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
128f0 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
12900 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12910 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
12920 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
12930 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
12940 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
12950 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
12960 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
12970 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
12980 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
12990 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
129a0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
129b0 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
129c0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
129d0 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
129e0 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
129f0 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
12a00 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
12a10 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
12a20 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
12a30 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
12a40 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
12a50 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
12a60 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
12a70 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
12a80 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
12a90 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
12aa0 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
12ab0 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
12ac0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
12ad0 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
12ae0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
12af0 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
12b00 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
12b10 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
12b20 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
12b30 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
12b40 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
12b50 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
12b60 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
12b70 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
12b80 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
12b90 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
12ba0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
12bb0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
12bc0 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
12bd0 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
12be0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
12bf0 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
12c00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
12c10 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
12c20 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
12c30 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
12c40 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
12c50 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
12c60 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
12c70 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
12c80 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
12c90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
12ca0 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
12cb0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
12cc0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
12cd0 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
12ce0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
12cf0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
12d00 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
12d10 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
12d20 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
12d30 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
12d40 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
12d50 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
12d60 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
12d70 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
12d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
12d90 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
12da0 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
12db0 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
12dc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
12dd0 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
12de0 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
12df0 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
12e00 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
12e10 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
12e20 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
12e30 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
12e40 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
12e50 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
12e60 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
12e70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12e80 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
12e90 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
12ea0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
12eb0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
12ec0 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
12ed0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
12ee0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
12ef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12f00 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
12f10 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
12f20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12f30 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
12f40 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
12f50 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
12f60 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
12f70 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
12f80 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
12f90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
12fa0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
12fb0 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
12fc0 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
12fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12fe0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12ff0 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
13000 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
13010 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
13020 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13030 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
13040 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
13050 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
13060 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13070 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13080 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
13090 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
130a0 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
130b0 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
130c0 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
130d0 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a  ge rollback */..
130e0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
130f0 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
13100 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
13110 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
13120 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
13130 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
13140 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
13150 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13160 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
13170 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13180 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
13190 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
131a0 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
131b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
131c0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
131d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
131e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
131f0 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
13200 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
13210 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
13220 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13230 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
13240 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
13250 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
13260 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
13270 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
13280 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
13290 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
132a0 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
132b0 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
132c0 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
132d0 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
132e0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
132f0 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
13300 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
13310 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
13320 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
13330 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
13340 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
13350 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
13360 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
13370 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13380 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
13390 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61  ix.c,.  **  mxPa
133a0 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
133b0 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
133c0 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
133d0 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
133e0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
133f0 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
13400 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
13410 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
13420 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
13430 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
13440 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
13450 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13460 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
13470 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
13480 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
13490 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
134a0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
134b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
134c0 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
134d0 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
134e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
134f0 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
13500 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
13510 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
13520 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13530 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
13540 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
13550 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
13560 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
13570 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
13580 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
13590 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
135a0 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
135b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
135c0 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
135d0 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
135e0 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
135f0 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55  1 ){.    int isU
13600 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  nsync = 0;..    
13610 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
13620 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13630 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
13640 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
13650 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
13660 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
13670 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
13680 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
13690 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
136a0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
136b0 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
136c0 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
136d0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
136e0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
136f0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
13700 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
13710 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
13720 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
13730 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
13740 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
13750 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
13760 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13770 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
13780 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
13790 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
137a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
137b0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
137c0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
137d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
137e0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
137f0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
13800 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
13810 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
13820 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
13830 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
13840 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
13850 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
13860 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
13870 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
13880 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
13890 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
138a0 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
138b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
138c0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
138d0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
138e0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
138f0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
13900 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
13910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13920 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
13930 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
13940 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
13950 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
13960 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
13970 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
13980 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
13990 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
139a0 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
139b0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
139c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
139d0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
139e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
139f0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
13a00 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
13a10 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
13a20 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
13a30 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
13a40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13a50 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
13a60 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
13a70 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
13a80 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
13a90 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
13aa0 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
13ab0 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
13ac0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
13ad0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
13ae0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
13af0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
13b00 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
13b10 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
13b20 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
13b30 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
13b40 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
13b50 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
13b60 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
13b70 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
13b80 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
13b90 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
13ba0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
13bb0 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
13bc0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
13bd0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
13be0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
13bf0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
13c00 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
13c10 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
13c20 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
13c30 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
13c40 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
13c50 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
13c60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
13c70 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
13c80 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
13c90 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
13ca0 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
13cb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
13cc0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
13cd0 74 65 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d  testcase( nRec==
13ce0 30 20 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20  0 && !isHot.    
13cf0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
13d00 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
13d10 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
13d20 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )!=pPager->journ
13d30 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26  alOff.         &
13d40 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  & ((szJ - pPager
13d50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
13d60 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
13d70 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20  ager))>0.       
13d80 20 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f    && pagerNextJo
13d90 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64  urnalPageIsValid
13da0 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a  (pPager).    );.
13db0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
13dc0 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
13dd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13de0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
13df0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
13e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13e10 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
13e20 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
13e30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13e40 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
13e50 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13e60 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31      isUnsync = 1
13e70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13e80 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
13e90 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
13ea0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13eb0 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
13ec0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13ed0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
13ee0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
13ef0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13f00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13f10 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
13f20 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
13f30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
13f40 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
13f50 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
13f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13f70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
13f80 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13f90 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
13fa0 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
13fb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13fc0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
13fd0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
13fe0 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
13ff0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
14000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14010 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
14020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14030 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
14040 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
14050 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
14060 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
14070 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
14080 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
14090 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
140a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
140b0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
140c0 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e  ge(pPager,1,isUn
140d0 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  sync,&pPager->jo
140e0 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20  urnalOff,0,0);. 
140f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14120 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
14130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14140 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
14150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14160 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
14170 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14190 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
141a0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
141b0 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
141c0 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
141d0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
141e0 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
141f0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
14200 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
14210 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14220 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
14230 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
14240 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
14250 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
14260 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
14270 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
14280 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
14290 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
142a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
142b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
142c0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
142d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
142e0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
142f0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
14300 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
14310 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
14320 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
14330 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
14340 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
14350 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
14360 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
14370 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
14380 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
14390 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
143a0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
143b0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
143c0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
143d0 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
143e0 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
143f0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
14400 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
14410 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
14420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
14430 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
14440 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
14450 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
14460 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
14470 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
14480 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
14490 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
144a0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
144b0 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
144c0 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
144d0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
144e0 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
144f0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
14500 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
14510 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
14520 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
14530 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
14540 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
14550 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
14560 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
14570 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
14580 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
14590 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
145a0 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
145b0 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
145c0 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
145d0 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
145e0 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
145f0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
14600 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
14610 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
14620 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14630 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
14640 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
14650 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
14660 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
14670 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
14680 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
14690 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
146a0 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
146b0 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
146c0 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
146d0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
146e0 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
146f0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
14700 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
14710 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
14720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14730 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
14740 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
14750 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
14760 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
14770 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
14780 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
14790 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
147a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
147b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
147c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
147d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
147e0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
147f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
14800 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
14810 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
14820 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14830 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
14840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14850 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
14860 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
14870 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
14880 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
14890 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
148a0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
148b0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
148c0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
148d0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
148e0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
148f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
14900 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
14910 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
14920 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14930 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
14940 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
14950 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
14960 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
14970 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
14980 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
14990 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
149a0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
149b0 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
149c0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
149d0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
149e0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
149f0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
14a00 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
14a10 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
14a20 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
14a30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
14a40 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
14a50 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
14a60 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
14a70 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
14a80 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
14a90 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
14aa0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
14ab0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
14ac0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
14ad0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
14ae0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
14af0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
14b00 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
14b10 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
14b20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
14b30 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
14b40 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
14b50 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
14b60 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14b70 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
14b80 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
14b90 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
14ba0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
14bb0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
14bc0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
14bd0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
14be0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
14bf0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
14c00 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
14c10 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
14c20 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
14c30 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
14c40 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
14c50 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
14c60 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14c70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
14c80 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
14c90 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14ca0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
14cb0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14cc0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
14cd0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
14ce0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14cf0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
14d00 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
14d10 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
14d20 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
14d30 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
14d40 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
14d50 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
14d60 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
14d70 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14d80 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
14d90 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14da0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
14db0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
14dc0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
14dd0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14de0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
14df0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
14e00 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
14e10 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
14e20 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
14e30 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
14e40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
14e50 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
14e60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
14e70 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
14e80 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
14e90 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
14ea0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14eb0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
14ec0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
14ed0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
14ee0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
14ef0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
14f00 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
14f10 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
14f20 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
14f30 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
14f40 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
14f50 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
14f60 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
14f70 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
14f80 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
14f90 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
14fa0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14fb0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
14fc0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
14fd0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
14fe0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
14ff0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
15000 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
15010 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
15020 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
15030 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
15040 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
15050 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
15060 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
15070 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
15080 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
15090 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
150a0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
150b0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
150c0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
150d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
150e0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
150f0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
15100 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
15110 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
15120 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
15130 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
15140 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
15150 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
15160 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
15170 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
15180 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
15190 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
151a0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
151b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
151c0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
151d0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
151e0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
151f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15200 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
15210 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
15220 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
15230 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
15240 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
15250 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
15260 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
15270 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15280 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
15290 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
152a0 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
152b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
152c0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
152d0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
152e0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
152f0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
15300 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
15310 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
15320 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
15330 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15340 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15350 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
15360 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
15370 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
15380 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
15390 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
153a0 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
153b0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
153c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
153d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
153e0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
153f0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
15400 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
15410 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
15420 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
15430 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
15440 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
15450 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
15460 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
15470 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
15480 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
15490 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
154a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
154b0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
154c0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
154d0 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
154e0 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
154f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
15500 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
15510 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
15520 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15530 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ff;..  /* Begin 
15540 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
15550 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
15560 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
15570 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
15580 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
15590 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
155a0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
155b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
155c0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
155d0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
155e0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
155f0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
15600 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
15610 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
15620 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
15630 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
15640 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
15650 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
15660 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
15670 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
15680 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
15690 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
156a0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
156b0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
156c0 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  t ){.    iHdrOff
156d0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
156e0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
156f0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
15700 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
15710 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15720 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
15730 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
15740 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15750 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15760 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
15770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15780 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15790 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
157a0 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
157b0 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
157c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
157d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
157e0 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
157f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
15800 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
15810 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
15820 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
15830 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
15840 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
15850 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
15860 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
15870 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
15880 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
15890 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
158a0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
158b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
158c0 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
158d0 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
158e0 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
158f0 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
15900 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
15910 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
15920 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
15930 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
15940 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
15950 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
15960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15970 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15980 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
15990 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
159a0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
159b0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
159c0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
159d0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
159e0 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
159f0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
15a00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15a10 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
15a20 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
15a30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15a40 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
15a50 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
15a60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
15a70 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
15a80 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
15a90 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
15aa0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
15ab0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
15ac0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
15ad0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
15ae0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
15af0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15b00 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20  !(nJRec==0.     
15b10 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
15b20 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
15b30 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15b40 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
15b50 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26  lOff.         &&
15b60 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d   ((szJ - pPager-
15b70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
15b80 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
15b90 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20  ger))>0.        
15ba0 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75   && pagerNextJou
15bb0 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
15bc0 70 50 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a  pPager)).    );.
15bd0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
15be0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
15bf0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15c00 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15c10 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15c20 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
15c30 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
15c40 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
15c50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
15c60 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
15c70 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
15c80 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
15c90 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
15ca0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
15cb0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
15cc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
15cd0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15ce0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15cf0 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e   1, 0, &pPager->
15d00 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70  journalOff, 1, p
15d10 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15d20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15d30 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15d40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15d50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
15d60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73  r->journalOff==s
15d70 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
15d80 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
15d90 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
15da0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
15db0 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
15dc0 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
15dd0 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
15de0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
15df0 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
15e00 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
15e10 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
15e20 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
15e30 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
15e40 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15e50 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
15e60 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
15e70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15e80 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
15e90 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69  ffset = pSavepoi
15ea0 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
15eb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15ec0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  ;.    for(ii=pSa
15ed0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
15ee0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15ef0 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
15f00 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
15f10 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
15f20 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72  et==ii*(4+pPager
15f30 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
15f40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15f50 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
15f60 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20  e(pPager, 0, 0, 
15f70 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e  &offset, 1, pDon
15f80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
15f90 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15fa0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
15fb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
15fc0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
15fd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15fe0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15ff0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
16000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16010 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
16020 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
16030 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
16040 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
16050 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
16060 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16070 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
16080 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
16090 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
160a0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
160b0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
160c0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
160d0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
160e0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
160f0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
16100 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
16110 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
16120 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
16130 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
16140 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
16150 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
16160 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
16170 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
16180 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
16190 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
161a0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
161b0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
161c0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
161d0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
161e0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
161f0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
16200 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
16210 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
16220 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
16230 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
16240 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
16250 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16260 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
16270 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
16280 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
16290 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
162a0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
162b0 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
162c0 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
162d0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
162f0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
16300 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
16310 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
16320 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
16330 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
16340 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
16350 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
16360 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
16370 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
16380 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
16390 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
163a0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
163b0 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
163c0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
163d0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
163f0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
16400 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
16410 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
16420 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
16430 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
16440 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
16450 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
16460 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
16470 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
16480 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
16490 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
164a0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
164b0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
164c0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
164d0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
164e0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
16500 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
16510 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
16520 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
16530 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16540 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
16550 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
16560 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
16570 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
16580 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
16590 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
165a0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
165b0 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
165c0 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
165d0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
165e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
165f0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
16600 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
16610 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
16620 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
16630 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
16640 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
16650 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
16660 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
16670 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
16680 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
16690 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
166a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
166b0 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
166c0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
166d0 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
166e0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
166f0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
16700 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16710 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
16720 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
16730 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16740 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
16750 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
16760 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
16770 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
16780 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
16790 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
167a0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
167b0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
167c0 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
167d0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
167e0 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
167f0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
16800 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
16810 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
16820 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
16830 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
16840 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
16850 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16860 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
16870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16880 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
16890 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
168a0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
168b0 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
168c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
168d0 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
168e0 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
168f0 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
16900 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
16910 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
16920 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
16930 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
16940 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
16950 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
16960 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
16970 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16980 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
16990 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
169a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
169b0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
169c0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
169d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
169e0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
169f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16a00 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
16a10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
16a20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16a30 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
16a40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
16a50 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
16a60 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16a70 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
16a80 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
16a90 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
16aa0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
16ab0 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
16ac0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16ad0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16ae0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16af0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
16b00 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
16b10 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
16b20 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
16b30 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
16b40 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
16b50 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
16b60 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16b70 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16b80 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
16b90 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
16ba0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
16bb0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
16bc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16bd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
16be0 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
16bf0 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
16c00 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16c10 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
16c20 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
16c30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
16c40 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
16c50 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
16c60 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
16c70 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
16c80 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
16c90 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
16ca0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
16cb0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
16cc0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
16cd0 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
16ce0 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
16cf0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16d00 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
16d10 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
16d20 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
16d30 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
16d40 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
16d50 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
16d60 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
16d70 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
16d80 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
16d90 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
16da0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
16db0 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
16dc0 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
16dd0 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
16de0 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
16df0 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
16e20 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
16e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e60 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
16e70 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
16e80 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
16e90 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
16ea0 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
16eb0 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
16ec0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
16ed0 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
16ee0 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
16ef0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
16f00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
16f10 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
16f20 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16f30 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
16f40 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
16f50 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
16f60 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
16f70 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
16f80 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
16f90 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
16fa0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
16fb0 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
16fc0 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
16fd0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
16fe0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
16ff0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
17000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17010 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
17020 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
17030 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
17040 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
17050 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17060 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
17070 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
17080 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
170b0 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
170c0 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50  ler */.){  .  pP
170d0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
170e0 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
170f0 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
17100 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
17110 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
17120 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
17130 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
17140 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
17150 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
17160 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
17170 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
17180 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
17190 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
171a0 73 20 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74  s modified (rest
171b0 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74  ored).** as part
171c0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
171d0 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  n or savepoint r
171e0 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c  ollback. The cal
171f0 6c 62 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20  lback gives .** 
17200 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
17210 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  e an opportunity
17220 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
17230 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
17240 20 0a 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20   .** agree with 
17250 74 68 65 20 72 65 73 74 6f 72 65 64 20 70 61 67  the restored pag
17260 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
17270 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
17280 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
17290 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
172a0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29  einit)(DbPage*))
172b0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
172c0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
172d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
172e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
172f0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
17300 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
17310 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
17320 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
17330 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
17340 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
17350 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
17360 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
17370 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
17380 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
17390 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
173a0 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
173b0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
173c0 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
173d0 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
173e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
173f0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
17400 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
17410 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
17420 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
17430 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
17440 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17450 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
17460 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
17470 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
17480 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
17490 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
174a0 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
174b0 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
174c0 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
174d0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
174e0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
174f0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
17500 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
17510 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
17520 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
17530 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
17540 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
17550 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
17560 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
17570 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
17580 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
17590 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
175a0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
175b0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
175c0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
175d0 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
175e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
175f0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
17600 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
17610 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
17620 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
17630 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
17640 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
17650 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17660 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17670 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
17680 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
17690 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
176a0 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
176b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
176c0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
176d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
176e0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
176f0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
17700 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
17710 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
17720 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
17730 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
17740 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
17750 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
17760 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
17770 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
17780 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
17790 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
177a0 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
177b0 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
177c0 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
177d0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
177e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
177f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17800 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17810 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
17820 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a  16 *pPageSize){.
17830 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
17840 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
17850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17860 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53  ){.    u16 pageS
17870 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
17880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
17890 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
178a0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
178b0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
178c0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
178d0 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
178e0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
178f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17900 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
17910 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
17920 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
17930 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
17940 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
17950 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
17960 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
17970 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
17980 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
17990 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
179a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
179b0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
179c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
179d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
179e0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
179f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17a00 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17a10 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
17a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17a30 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
17a40 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
17a50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
17a60 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
17a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
17a80 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
17a90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
17aa0 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
17ab0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
17ac0 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  PageSize = (u16)
17ad0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ae0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17af0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17b00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17b10 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
17b20 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
17b30 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
17b40 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
17b50 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
17b60 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
17b70 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
17b80 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
17b90 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
17ba0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
17bb0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
17bc0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
17bd0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
17be0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
17bf0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
17c00 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
17c10 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
17c20 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
17c30 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
17c40 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
17c50 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
17c60 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
17c70 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
17c80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
17c90 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
17ca0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
17cb0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17cc0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
17cd0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
17ce0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
17cf0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
17d00 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
17d10 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
17d20 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
17d30 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
17d40 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
17d50 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
17d60 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
17d70 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
17d80 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
17d90 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
17da0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
17db0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
17dc0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
17dd0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17de0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
17df0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
17e00 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
17e10 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
17e20 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
17e30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
17e40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17e50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
17e60 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
17e70 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
17e80 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
17e90 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
17ea0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
17eb0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
17ec0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
17ed0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
17ee0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
17ef0 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
17f00 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
17f10 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
17f20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
17f30 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
17f40 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
17f50 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
17f60 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
17f70 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
17f80 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
17f90 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
17fa0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
17fb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17fc0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
17fd0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17fe0 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
17ff0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
18000 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
18010 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
18020 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
18030 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
18040 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
18050 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
18060 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
18070 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
18080 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18090 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
180a0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
180b0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
180c0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
180d0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
180e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
180f0 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
18100 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
18110 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
18120 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
18130 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
18140 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
18150 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
18160 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
18170 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
18180 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
18190 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
181a0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
181b0 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
181c0 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
181d0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
181e0 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
181f0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
18200 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
18210 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
18220 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
18230 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
18240 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
18250 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
18260 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
18270 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
18280 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
18290 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
182a0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
182b0 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
182c0 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
182d0 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
182e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
182f0 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
18300 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
18310 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
18320 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
18330 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
18340 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
18350 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
18360 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
18370 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
18380 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
18390 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
183a0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
183b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
183c0 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
183d0 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
183e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
183f0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
18400 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
18410 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18420 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
18430 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66  tempFile );.  if
18440 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18450 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
18460 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
18470 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
18480 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
18490 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
184a0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
184b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
184c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
184d0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
184e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
184f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
18500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18510 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
18520 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
18530 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
18540 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
18550 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
18560 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
18570 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
18580 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
18590 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
185a0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
185b0 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
185c0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
185d0 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
185e0 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
185f0 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
18600 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
18610 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
18620 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
18630 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
18640 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18650 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
18660 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
18670 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18680 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
18690 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
186a0 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
186b0 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
186c0 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
186d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
186e0 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
186f0 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
18700 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
18710 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
18720 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
18730 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
18740 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
18750 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
18760 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
18770 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
18780 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
18790 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
187a0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
187b0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
187c0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
187d0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
187e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
187f0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
18800 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
18810 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18830 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
18840 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
18850 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
18860 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69  ger is already i
18870 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
18880 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
18890 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69  ror code. */.  i
188a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
188b0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
188c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
188d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
188e0 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
188f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18900 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
18910 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
18920 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
18930 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
18940 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
18950 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
18960 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18980 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
18990 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
189a0 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
189c0 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
189d0 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
189e0 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
189f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
18a00 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18a10 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18a20 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
18a30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
18a40 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
18a50 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
18a60 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
18a70 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61  n))) ){.      pa
18a80 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
18a90 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
18aa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18ab0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
18ac0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18ad0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
18ae0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
18af0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
18b00 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
18b10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18b20 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18b30 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
18b40 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
18b50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
18b60 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
18b70 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
18b80 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
18b90 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18ba0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
18bb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
18bc0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
18bd0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
18be0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
18bf0 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
18c00 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
18c10 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
18c20 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
18c30 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
18c40 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
18c50 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
18c60 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
18c70 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
18c80 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
18c90 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
18ca0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
18cb0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
18cc0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
18cd0 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20  ITE_OK */.  if( 
18ce0 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  pnPage ){.    *p
18cf0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
18d00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18d10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
18d20 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
18d30 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
18d40 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
18d50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
18d60 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
18d70 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
18d80 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
18d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
18da0 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
18db0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
18dc0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
18dd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
18de0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
18df0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
18e00 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
18e10 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
18e20 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
18e30 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
18e40 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
18e50 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
18e60 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
18e70 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
18e80 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
18e90 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
18ea0 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
18eb0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
18ec0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18ed0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
18ee0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
18ef0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
18f00 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
18f10 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
18f20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
18f30 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
18f40 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
18f50 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
18f60 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
18f70 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
18f80 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
18f90 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
18fa0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
18fb0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18fe0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
18ff0 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
19000 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
19010 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
19020 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
19030 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
19040 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
19050 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
19060 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
19070 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
19080 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
19090 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
190a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
190b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
190c0 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
190d0 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
190e0 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
190f0 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
19100 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19110 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
19120 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
19130 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a  izeValid==0 );..
19140 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
19150 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
19160 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
19170 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
19180 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
19190 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
191a0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
191b0 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
191c0 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
191d0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
191e0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
191f0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
19200 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
19210 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
19220 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
19230 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
19240 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
19250 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
19260 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19270 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  R_UNLOCK && lock
19280 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  type==PAGER_SHAR
19290 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED).       || (p
192a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
192b0 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20  GER_RESERVED && 
192c0 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
192d0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a  EXCLUSIVE).  );.
192e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
192f0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
19300 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19310 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
19320 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
19330 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
19340 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
19350 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
19360 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
19370 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
19380 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
19390 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
193a0 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Arg) );.    if( 
193b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
193c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
193d0 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  tate = (u8)lockt
193e0 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
193f0 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
19400 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
19410 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
19420 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19430 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
19440 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
19450 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
19460 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
19470 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
19480 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
19490 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
194a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
194b0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
194c0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
194d0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
194e0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
194f0 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
19500 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
19510 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
19520 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
19530 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
19540 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
19550 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
19560 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
19570 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
19580 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19590 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
195a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
195b0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
195c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
195d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
195e0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
195f0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19600 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a   = nPage;.}../*.
19610 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
19620 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
19630 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
19640 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
19650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
19660 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
19670 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
19680 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
19690 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
196a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
196b0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
196c0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
196d0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
196e0 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
196f0 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
19700 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
19710 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
19720 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
19730 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
19740 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
19750 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
19760 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
19770 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
19780 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19790 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
197a0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
197b0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
197c0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
197d0 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
197e0 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
197f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
19800 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
19810 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
19820 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
19830 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
19840 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
19850 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
19860 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
19870 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
19880 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19890 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
198a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
198b0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
198c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
198d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
198e0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
198f0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
19900 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
19910 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
19920 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
19930 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
19940 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19950 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75  /* Set Pager.jou
19960 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f  rnalHdr to -1 fo
19970 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66  r the benefit of
19980 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
19990 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ack() .    ** ca
199a0 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  ll which may be 
199b0 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  made from within
199c0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
199d0 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74  ollback(). If it
199e0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d  .    ** is not -
199f0 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79  1, then the unsy
19a00 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
19a10 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  an open journal 
19a20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  file may.    ** 
19a30 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
19a40 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19a50 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
19a60 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
19a70 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
19a80 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
19a90 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 63  database may bec
19aa0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
19ab0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
19ac0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b  journalHdr = -1;
19ad0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
19ae0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
19af0 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
19b00 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
19b10 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
19b20 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19b30 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
19b40 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
19b50 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19b60 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
19b70 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
19b80 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
19b90 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
19ba0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
19bb0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
19bc0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
19bd0 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
19be0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
19bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
19c00 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
19c10 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
19c20 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
19c30 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
19c40 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
19c50 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
19c60 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
19c70 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
19c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19c90 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
19ca0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
19cb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
19cc0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
19cd0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
19ce0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
19cf0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
19d00 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
19d10 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
19d20 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
19d30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
19d40 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
19d50 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
19d60 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
19d70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
19d80 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
19d90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19da0 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
19db0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
19dc0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
19dd0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
19de0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
19df0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
19e00 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
19e10 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
19e20 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
19e30 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
19e40 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
19e50 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
19e60 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
19e70 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
19e80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
19e90 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
19ea0 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  ag is not set, t
19eb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
19ec0 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e  n is a.** no-op.
19ed0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
19ee0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
19ef0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
19f00 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61  ournal-mode.** a
19f10 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63 68  nd the device ch
19f20 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
19f30 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
19f40 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
19f50 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
19f60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
19f70 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
19f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
19f90 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
19fa0 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
19fb0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
19fc0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
19fd0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19fe0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
19ff0 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
1a000 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
1a010 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
1a020 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
1a030 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
1a040 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
1a050 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
1a060 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
1a070 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
1a080 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
1a090 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
1a0a0 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
1a0b0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
1a0c0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
1a0d0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
1a0e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1a0f0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
1a100 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
1a110 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
1a120 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
1a130 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1a140 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
1a150 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
1a160 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
1a170 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
1a180 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
1a190 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
1a1a0 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
1a1b0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
1a1c0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
1a1d0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
1a1e0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
1a1f0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
1a200 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1a210 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
1a220 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
1a230 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
1a240 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
1a250 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
1a260 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1a270 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
1a280 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  The Pager.needSy
1a290 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72  nc flag is never
1a2a0 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70   be set for temp
1a2b0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20  orary files, or 
1a2c0 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72  any.** file oper
1a2d0 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  ating in no-sync
1a2e0 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53   mode (Pager.noS
1a2f0 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a  ync set to non-z
1a300 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ero)..**.** If s
1a310 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
1a320 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
1a330 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1a340 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
1a350 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
1a360 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
1a370 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
1a380 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
1a390 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
1a3a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1a3b0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1a3c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a3d0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1a3e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a3f0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
1a400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a410 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
1a420 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
1a430 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1a440 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1a450 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1a460 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1a470 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
1a480 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20  .      int rc;  
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a4b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1a4c0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
1a4d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1a4e0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a4f0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1a500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1a510 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1a520 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1a530 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1a540 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1a550 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1a560 56 61 72 69 61 62 6c 65 20 69 4e 52 65 63 4f 66  Variable iNRecOf
1a570 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
1a580 68 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  he offset in the
1a590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
1a5a0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1a5b0 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
1a5c0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1a5d0 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
1a5e0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1a5f0 2a 2a 20 54 68 69 73 20 66 69 65 6c 64 20 77 69  ** This field wi
1a600 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  ll be updated fo
1a610 6c 6c 6f 77 69 6e 67 20 74 68 65 20 78 53 79 6e  llowing the xSyn
1a620 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20  c() operation.  
1a630 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1a640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
1a650 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 52  .        i64 iNR
1a660 65 63 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  ecOffset = pPage
1a670 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
1a680 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1a690 61 67 69 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  agic);..        
1a6a0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1a6b0 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1a6c0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1a6d0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1a6e0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1a6f0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1a700 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1a710 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1a720 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1a730 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1a740 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a750 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1a760 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1a770 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1a780 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1a790 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1a7a0 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1a7b0 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1a7c0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1a7d0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1a7e0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1a7f0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1a800 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1a810 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1a820 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73  onnections trans
1a830 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1a840 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1a850 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1a860 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1a870 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1a880 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1a890 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1a8a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1a8b0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1a8c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1a8d0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1a8e0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1a8f0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a900 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1a910 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1a920 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1a930 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1a940 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a950 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1a960 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1a970 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1a980 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1a990 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1a9a0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1a9b0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1a9c0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1a9d0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1a9e0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1a9f0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1aa00 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1aa10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1aa20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1aa30 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1aa40 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1aa50 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1aa60 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1aa70 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1aa80 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1aa90 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1aaa0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1aab0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1aac0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1aad0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1aae0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1aaf0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ab00 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1ab10 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1ab20 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1ab30 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1ab40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1ab50 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1ab60 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1ab70 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1ab80 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1ab90 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1aba0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1abb0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1abc0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1abd0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1abe0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1abf0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1ac00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1ac10 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1ac20 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
1ac30 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1ac40 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
1ac50 5d 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ];.        rc = 
1ac60 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1ac70 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1ac80 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1ac90 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1aca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1acb0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1acc0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1acd0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1ace0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1acf0 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1ad00 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1ad10 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1ad20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1ad30 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1ad40 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1ad50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ad60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ad70 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1ad80 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1ad90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1ada0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1adb0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1adc0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1add0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1ade0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1adf0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1ae00 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1ae10 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1ae20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1ae30 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1ae40 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1ae50 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1ae60 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1ae70 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1ae80 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1ae90 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1aea0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1aeb0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1aec0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1aed0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1aee0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1aef0 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1af00 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1af10 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1af20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1af30 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1af40 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1af50 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1af60 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1af70 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1af80 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1af90 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1afa0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1afb0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1afc0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1afd0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1afe0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1aff0 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1b000 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1b010 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b020 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1b030 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1b040 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b050 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1b060 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b070 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b080 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b090 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b0a0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1b0b0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1b0c0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1b0d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b0e0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1b0f0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1b100 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1b110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b120 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b140 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1b150 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
1b160 20 70 50 61 67 65 72 2c 20 69 4e 52 65 63 4f 66   pPager, iNRecOf
1b170 66 73 65 74 2c 20 34 29 29 3b 0a 20 20 20 20 20  fset, 4));.     
1b180 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1b190 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
1b1a0 20 69 4e 52 65 63 4f 66 66 73 65 74 2c 20 70 50   iNRecOffset, pP
1b1b0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
1b1c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b1d0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b1e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b1f0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1b200 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1b210 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
1b220 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1b230 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
1b240 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1b250 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
1b260 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1b270 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1b280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b290 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1b2a0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1b2b0 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20  >sync_flags| .  
1b2c0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1b2d0 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c  >sync_flags==SQL
1b2e0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
1b2f0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1b300 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
1b310 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b330 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b340 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1b350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
1b360 61 73 20 6a 75 73 74 20 73 75 63 63 65 73 73 66  as just successf
1b370 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74  ully synced. Set
1b380 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1b390 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20  .    ** to zero 
1b3a0 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 50 47  and clear the PG
1b3b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
1b3c0 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73  ag on all pagess
1b3d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1b3e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
1b3f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
1b400 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1b410 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  1;.    sqlite3Pc
1b420 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
1b430 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
1b440 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  he);.  }..  retu
1b450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b460 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
1b470 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1b480 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
1b490 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1b4a0 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
1b4b0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
1b4c0 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
1b4d0 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
1b4e0 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
1b4f0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
1b500 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
1b510 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b520 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
1b530 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
1b540 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
1b550 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
1b560 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
1b570 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
1b580 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
1b590 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
1b5a0 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
1b5b0 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
1b5c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1b5d0 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
1b5e0 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
1b5f0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1b600 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
1b610 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
1b620 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
1b630 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
1b640 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
1b650 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
1b660 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
1b670 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
1b680 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
1b690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b6a0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
1b6b0 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
1b6c0 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
1b6d0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
1b6e0 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
1b6f0 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
1b700 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
1b710 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
1b720 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
1b730 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
1b740 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
1b750 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
1b760 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
1b770 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
1b780 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
1b790 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
1b7a0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b7b0 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
1b7c0 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
1b7d0 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
1b7e0 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
1b7f0 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
1b800 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
1b810 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
1b820 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
1b830 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
1b840 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
1b850 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
1b860 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
1b870 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
1b880 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
1b890 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
1b8a0 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
1b8b0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
1b8c0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
1b8d0 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
1b8e0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
1b8f0 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
1b900 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
1b910 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
1b920 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1b930 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
1b940 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
1b950 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
1b960 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1b970 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
1b980 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
1b990 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
1b9a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1b9b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
1b9c0 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
1b9d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1b9e0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
1b9f0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
1ba00 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
1ba10 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
1ba20 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1ba30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1ba40 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1ba50 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
1ba60 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
1ba70 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ba90 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1baa0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1bad0 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  code */..  if( p
1bae0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1baf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1bb00 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1bb10 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1bb20 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1bb30 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1bb40 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1bb50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1bb60 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1bb70 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1bb80 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1bb90 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1bba0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1bbb0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1bbc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1bbd0 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1bbe0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1bbf0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1bc00 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1bc10 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1bc20 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1bc30 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1bc40 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1bc50 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1bc60 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1bc70 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1bc80 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1bc90 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1bca0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1bcb0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1bcc0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1bcd0 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1bce0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1bcf0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1bd00 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1bd10 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1bd20 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1bd30 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1bd40 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1bd50 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1bd60 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1bd70 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1bd80 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1bd90 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1bda0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1bdb0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1bdc0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1bdd0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1bde0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1bdf0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1be00 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1be10 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1be20 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1be30 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1be40 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1be50 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1be60 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1be70 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1be80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1be90 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1bea0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
1beb0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1bec0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1bed0 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  K);..  /* If the
1bee0 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
1bef0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1bf00 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1bf10 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
1bf20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
1bf30 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
1bf40 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1bf50 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
1bf60 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
1bf70 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
1bf80 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
1bf90 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
1bfa0 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
1bfb0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1bfc0 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
1bfd0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1bfe0 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
1bff0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
1c000 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
1c010 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1c020 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
1c030 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  lags);.  }..  wh
1c040 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1c050 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
1c060 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
1c070 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
1c080 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1c090 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
1c0a0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
1c0b0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1c0c0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
1c0d0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1c0e0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
1c0f0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1c100 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
1c110 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
1c120 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
1c130 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
1c140 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1c150 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
1c160 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
1c170 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
1c180 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c190 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
1c1a0 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
1c1b0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
1c1c0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1c1d0 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
1c1e0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
1c1f0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1c200 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
1c210 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
1c220 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
1c230 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
1c240 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
1c250 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
1c260 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c270 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1c280 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
1c290 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c2a0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c2b0 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
1c2c0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c2d0 74 61 2c 20 70 67 6e 6f 2c 20 36 29 3b 20 2f 2a  ta, pgno, 6); /*
1c2e0 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
1c2f0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  /..      /* Writ
1c300 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
1c310 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
1c320 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1c330 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
1c340 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1c350 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
1c360 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
1c370 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
1c380 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
1c390 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
1c3a0 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
1c3b0 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
1c3c0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
1c3d0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
1c3e0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
1c3f0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
1c400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c410 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
1c420 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
1c430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1c440 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
1c450 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1c460 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c470 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
1c480 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1c490 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
1c4a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
1c4b0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
1c4c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1c4d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1c4e0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
1c4f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   }..      /* Upd
1c500 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
1c510 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
1c520 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c530 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
1c540 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1c550 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1c560 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
1c570 75 38 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20 20  u8 *)pData);..  
1c580 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c590 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
1c5a0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1c5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c5c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1c5d0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1c5e0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c5f0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1c600 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
1c610 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1c620 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
1c630 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1c640 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
1c650 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1c660 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
1c670 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  te);.    }else{.
1c680 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c690 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
1c6a0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1c6b0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
1c6c0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
1c6d0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1c6e0 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
1c6f0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1c700 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
1c710 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
1c720 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1c730 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c740 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
1c750 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
1c760 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1c770 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
1c780 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c790 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  . .** It is the 
1c7a0 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
1c7b0 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75  bility to use su
1c7c0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
1c7d0 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68   to check .** th
1c7e0 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  at it is really 
1c7f0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1c800 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1c810 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1c820 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1c830 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
1c840 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
1c850 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
1c860 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
1c870 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
1c880 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c890 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c8a0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
1c8b0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1c8c0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1c8d0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
1c8e0 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
1c8f0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
1c900 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c910 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
1c920 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
1c930 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
1c940 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
1c950 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
1c960 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
1c970 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
1c980 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
1c990 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1c9a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1c9b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1c9c0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
1c9d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c9e0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  sjfd) ){.    voi
1c9f0 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
1ca00 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f  pData;.    i64 o
1ca10 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
1ca20 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
1ca30 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1ca40 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1ca50 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1ca60 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1ca70 2c 20 37 29 3b 0a 20 20 0a 20 20 20 20 50 41 47  , 7);.  .    PAG
1ca80 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
1ca90 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1caa0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1cab0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1cac0 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72  ));.  .    asser
1cad0 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1cae0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
1caf0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1cb00 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  gSize );.    rc 
1cb10 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1cb20 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
1cb30 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
1cb40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cb50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cb60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1cb70 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
1cb80 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1cb90 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1cba0 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+4);.    }.  }.
1cbb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cbc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1cbd0 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
1cbe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cbf0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1cc00 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
1cc10 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1cc20 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1cc30 6e 6f 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  no);.    testcas
1cc40 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1cc50 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
1cc60 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1cc70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cc80 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
1cc90 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
1cca0 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
1ccb0 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
1ccc0 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
1ccd0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1cce0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
1ccf0 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
1cd00 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
1cd10 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
1cd20 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
1cd30 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
1cd40 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
1cd50 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
1cd60 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
1cd70 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
1cd80 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
1cd90 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
1cda0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1cdb0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
1cdc0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
1cdd0 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
1cde0 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
1cdf0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1ce00 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
1ce10 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
1ce20 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
1ce30 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
1ce40 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
1ce50 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
1ce60 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
1ce70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1ce80 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
1ce90 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
1cea0 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
1ceb0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
1cec0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1ced0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1cee0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
1cef0 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
1cf00 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1cf10 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1cf20 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1cf30 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
1cf40 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
1cf50 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
1cf60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1cf70 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
1cf80 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
1cf90 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
1cfa0 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
1cfb0 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
1cfc0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
1cfd0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1cfe0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1cff0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1d000 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
1d010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d020 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
1d030 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
1d040 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d050 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
1d060 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d070 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1d080 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
1d090 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
1d0a0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d0b0 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
1d0c0 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   The doNotSync f
1d0d0 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68  lag is set by th
1d0e0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1d0f0 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77  ite() function w
1d100 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  hile it.  ** is 
1d110 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65  journalling a se
1d120 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  t of two or more
1d130 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
1d140 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a  that are stored.
1d150 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65    ** on the same
1d160 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79   disk sector. Sy
1d170 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ncing the journa
1d180 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  l is not allowed
1d190 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73   while.  ** this
1d1a0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73   is happening as
1d1b0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
1d1c0 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72   that all member
1d1d0 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a  s of such a.  **
1d1e0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61 72   set of pages ar
1d1f0 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1d200 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69   together. So, i
1d210 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73 20  f the page this 
1d220 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
1d230 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
1d240 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69  clean will requi
1d250 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  re a journal syn
1d260 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53  c and the doNotS
1d270 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  ync.  ** flag is
1d280 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74   set, return wit
1d290 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
1d2a0 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65 20  ing. The pcache 
1d2b0 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20  layer will.  ** 
1d2c0 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20  just have to go 
1d2d0 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61  ahead and alloca
1d2e0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62 75  te a new page bu
1d2f0 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a  ffer instead of.
1d300 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67    ** reusing pPg
1d310 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69  ..  **.  ** Simi
1d320 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61  larly, if the pa
1d330 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
1d340 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
1d350 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a  r state, do not.
1d360 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74    ** try to writ
1d370 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d380 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20  f pPg to disk.. 
1d390 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1d3a0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
1d3b0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1d3c0 26 26 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  && pPg->flags&PG
1d3d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 29  HDR_NEED_SYNC) )
1d3e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d3f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1d400 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
1d410 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
1d420 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  red. */.  if( pP
1d430 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d440 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
1d450 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1d460 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1d470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d480 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  && pPager->fullS
1d490 79 6e 63 20 26 26 20 0a 20 20 20 20 20 20 21 28  ync && .      !(
1d4a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1d4b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
1d4c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26  ALMODE_MEMORY) &
1d4d0 26 0a 20 20 20 20 20 20 21 28 73 71 6c 69 74 65  &.      !(sqlite
1d4e0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1d4f0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1d500 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
1d510 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
1d520 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67     ){.      pPag
1d530 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
1d540 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
1d550 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1d560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d570 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
1d580 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
1d590 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
1d5a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1d5b0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  e of.  ** the da
1d5c0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
1d5d0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
1d5e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1d5f0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  ub-journal..  **
1d600 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1d610 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
1d620 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1d630 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
1d640 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  ot.  ** actually
1d650 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
1d660 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
1d670 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
1d680 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
1d690 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
1d6a0 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a  of events:.  **.
1d6b0 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
1d6c0 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
1d6d0 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20  page X>.  **    
1d6e0 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
1d6f0 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f  .  **     SAVEPO
1d700 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20  INT sp;.  **    
1d710 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
1d720 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
1d730 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20  ges>.  **       
1d740 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
1d750 20 58 29 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c   X).  **     ROL
1d760 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a  LBACK TO sp;.  *
1d770 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c  *.  ** If (X>Y),
1d780 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
1d790 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
1d7a0 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
1d7b0 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a   be written.  **
1d7c0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1d7d0 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
1d7e0 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
1d7f0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
1d800 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  hen,.  ** follow
1d810 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
1d820 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
1d830 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
1d840 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a   X will read.  *
1d850 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1d860 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1d870 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1d880 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
1d890 73 20 69 74 0a 20 20 2a 2a 20 77 61 73 20 77 68  s it.  ** was wh
1d8a0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1d8b0 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
1d8c0 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
1d8d0 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
1d8e0 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
1d8f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
1d900 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
1d910 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1d920 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
1d930 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
1d940 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1d950 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
1d960 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
1d970 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
1d980 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72  l.  ** be restor
1d990 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
1d9a0 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
1d9b0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
1d9c0 22 20 69 73 20 0a 20 20 2a 2a 20 65 78 65 63 75  " is .  ** execu
1d9d0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
1d9e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d9f0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
1da00 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
1da10 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
1da20 67 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  g) ){.    rc = s
1da30 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
1da40 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  g);.  }..  /* Wr
1da50 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
1da60 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
1da70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1da80 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20   file. */.  if( 
1da90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1daa0 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1dab0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1dac0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1dad0 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
1dae0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
1daf0 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
1db00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1db10 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
1db20 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
1db30 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1db40 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1db50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
1db60 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1db70 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
1db80 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
1db90 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1dba0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
1dbb0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1dbc0 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
1dbd0 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
1dbe0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
1dbf0 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
1dc00 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
1dc10 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
1dc20 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
1dc30 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
1dc40 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
1dc50 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
1dc60 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1dc70 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
1dc80 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1dc90 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
1dca0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
1dcb0 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
1dcc0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
1dcd0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
1dce0 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
1dcf0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
1dd00 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
1dd10 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
1dd20 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
1dd30 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
1dd40 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
1dd50 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
1dd60 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
1dd70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1dd80 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
1dd90 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
1dda0 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
1ddb0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1ddc0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
1ddd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1dde0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
1ddf0 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
1de00 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
1de10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1de20 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1de30 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
1de40 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
1de50 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
1de60 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
1de70 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
1de80 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
1de90 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
1dea0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
1deb0 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
1dec0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
1ded0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
1dee0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
1def0 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
1df00 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
1df10 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
1df20 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
1df30 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
1df40 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
1df50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1df60 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
1df70 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
1df80 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
1df90 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
1dfa0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
1dfb0 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
1dfc0 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
1dfd0 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
1dfe0 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
1dff0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
1e000 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
1e010 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1e020 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1e030 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
1e040 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
1e050 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1e060 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
1e070 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
1e080 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
1e090 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
1e0a0 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
1e0b0 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
1e0c0 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
1e0d0 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
1e0e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
1e0f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e100 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
1e110 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
1e120 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
1e130 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
1e140 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
1e150 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
1e160 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
1e170 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1e180 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
1e190 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
1e1a0 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
1e1b0 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
1e1c0 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
1e1d0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
1e1e0 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
1e1f0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1e200 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
1e210 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1e220 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
1e230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e240 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1e250 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
1e260 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
1e270 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
1e280 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
1e290 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
1e2a0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1e2b0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
1e2c0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
1e2d0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
1e2e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
1e2f0 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
1e300 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
1e310 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
1e320 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
1e330 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e340 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
1e350 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
1e360 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
1e370 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
1e380 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1e390 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e3a0 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
1e3b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1e3c0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
1e3d0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
1e3e0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
1e3f0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
1e400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e410 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
1e420 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
1e430 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
1e440 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1e450 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e460 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
1e470 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
1e480 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
1e490 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1e4a0 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
1e4b0 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
1e4c0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
1e4d0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
1e4e0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
1e4f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
1e500 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
1e510 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1e520 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
1e530 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
1e540 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
1e550 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
1e560 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
1e570 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
1e580 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
1e590 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
1e5a0 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
1e5b0 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
1e5c0 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
1e5d0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
1e5e0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
1e5f0 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
1e600 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
1e610 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
1e620 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50  che */.  u16 szP
1e630 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
1e640 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1e650 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
1e660 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
1e670 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1e680 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
1e690 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
1e6a0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
1e6b0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
1e6c0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
1e6d0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
1e6e0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
1e6f0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
1e700 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
1e710 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
1e720 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
1e730 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
1e740 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
1e750 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
1e760 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
1e770 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
1e780 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
1e790 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
1e7a0 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
1e7b0 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
1e7c0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
1e7d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1e7e0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
1e7f0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
1e800 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
1e810 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
1e820 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
1e830 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
1e840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
1e850 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
1e860 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
1e870 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
1e880 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1e890 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
1e8a0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
1e8b0 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
1e8c0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
1e8d0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
1e8e0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
1e8f0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
1e900 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
1e910 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
1e920 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
1e930 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
1e940 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
1e950 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
1e960 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
1e970 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
1e980 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
1e990 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
1e9a0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
1e9b0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
1e9c0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
1e9d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
1e9e0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
1e9f0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
1ea00 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
1ea10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
1ea20 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
1ea30 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
1ea40 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
1ea50 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
1ea60 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
1ea70 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
1ea80 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
1ea90 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
1eaa0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1eab0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1eac0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ead0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
1eae0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
1eaf0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
1eb00 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
1eb10 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
1eb20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
1eb30 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
1eb40 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
1eb50 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
1eb60 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
1eb70 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
1eb80 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
1eb90 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
1eba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ebb0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
1ebc0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
1ebd0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
1ebe0 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
1ebf0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
1ec00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
1ec10 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
1ec20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ec30 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
1ec40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
1ec50 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
1ec60 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
1ec70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ec80 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
1ec90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
1eca0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
1ecb0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
1ecc0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
1ecd0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
1ece0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1ecf0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
1ed00 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
1ed10 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
1ed20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
1ed30 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
1ed40 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
1ed50 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
1ed60 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
1ed70 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
1ed80 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
1ed90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1eda0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
1edb0 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OPEN;.    }.    
1edc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1edd0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1ede0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1edf0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1ee00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
1ee10 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
1ee20 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
1ee30 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
1ee40 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
1ee50 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
1ee60 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
1ee70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ee80 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
1ee90 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
1eea0 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
1eeb0 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
1eec0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1eed0 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
1eee0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
1eef0 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
1ef00 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
1ef10 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
1ef20 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
1ef30 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
1ef40 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
1ef50 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1ef60 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
1ef80 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
1ef90 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
1efa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1efb0 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
1efc0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
1efd0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
1efe0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
1eff0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
1f000 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
1f010 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
1f020 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1f040 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
1f050 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
1f060 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
1f070 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1f080 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
1f090 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
1f0a0 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
1f0b0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
1f0c0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
1f0d0 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
1f0e0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
1f0f0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
1f100 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
1f110 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
1f120 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
1f130 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
1f140 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
1f150 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
1f160 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
1f170 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
1f180 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
1f190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
1f1a0 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
1f1b0 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
1f1c0 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
1f1d0 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
1f1e0 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20  me + 8 + 1      
1f1f0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
1f200 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73  nal */.  );.  as
1f210 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1f220 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
1f230 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
1f240 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
1f250 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
1f260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f270 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1f280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f290 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
1f2a0 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
1f2b0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
1f2c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
1f2d0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
1f2e0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f2f0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
1f300 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
1f310 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
1f320 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
1f330 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
1f340 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
1f350 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
1f360 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f370 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
1f380 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
1f390 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
1f3a0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
1f3b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
1f3c0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
1f3d0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
1f3e0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
1f3f0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
1f400 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1f410 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
1f420 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
1f430 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
1f440 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
1f450 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
1f460 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
1f470 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
1f480 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1f490 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f4a0 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
1f4b0 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
1f4c0 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   1);.    memcpy(
1f4d0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f4e0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
1f4f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f500 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
1f510 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
1f520 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1f530 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1f540 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
1f550 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
1f560 22 2c 20 38 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 8);.    sqlit
1f570 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1f580 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
1f590 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
1f5a0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
1f5b0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
1f5c0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
1f5d0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
1f5e0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
1f5f0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
1f600 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
1f610 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
1f640 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
1f650 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1f660 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1f670 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f680 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
1f690 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
1f6a0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
1f6b0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
1f6c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
1f6d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1f6e0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
1f6f0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
1f700 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
1f710 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
1f720 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
1f730 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
1f740 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
1f750 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1f760 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
1f770 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
1f780 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
1f790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f7a0 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
1f7b0 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
1f7c0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
1f7d0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1f7e0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1f7f0 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
1f800 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
1f810 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
1f820 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
1f830 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
1f840 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f850 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
1f860 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
1f870 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1f880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
1f890 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1f8a0 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
1f8b0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f8c0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
1f8d0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
1f8e0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
1f8f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1f900 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1f910 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
1f920 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
1f930 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
1f940 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
1f950 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f960 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
1f970 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1f980 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36  zPageDflt = (u16
1f990 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
1f9a0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
1f9b0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1f9c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
1f9d0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
1f9e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
1f9f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
1fa00 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fa10 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
1fa20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
1fa30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1fa40 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fa50 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
1fa60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fa70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fa80 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
1fa90 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
1faa0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
1fab0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fac0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
1fad0 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
1fae0 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
1faf0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1fb00 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
1fb10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1fb20 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
1fb30 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
1fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fb50 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
1fb60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1fb80 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
1fb90 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
1fba0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1fbb0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
1fbc0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
1fbd0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
1fbe0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1fbf0 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
1fc00 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
1fc10 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
1fc20 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
1fc30 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
1fc40 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
1fc50 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
1fc60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1fc70 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
1fc80 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
1fc90 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
1fca0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
1fcb0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
1fcc0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
1fcd0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
1fce0 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
1fcf0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
1fd00 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
1fd10 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
1fd20 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
1fd30 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
1fd40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1fd50 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1fd60 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  USIVE;.  }..  /*
1fd70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1fd80 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
1fd90 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
1fda0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
1fdb0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
1fdc0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
1fdd0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
1fde0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
1fdf0 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
1fe00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fe10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1fe20 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
1fe30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1fe40 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1fe50 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
1fe60 67 65 44 66 6c 74 29 3b 0a 20 20 20 20 74 65 73  geDflt);.    tes
1fe70 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1fe80 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
1fe90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1fea0 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
1feb0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
1fec0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
1fed0 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
1fee0 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
1fef0 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
1ff00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ff10 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1ff20 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
1ff30 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
1ff40 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1ff50 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
1ff60 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1ff70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ff80 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1ff90 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
1ffa0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 6e 45 78  object. */.  nEx
1ffb0 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
1ffc0 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
1ffd0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
1ffe0 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
1fff0 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
20000 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
20010 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
20020 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
20030 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20040 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
20050 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
20060 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
20070 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
20080 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
20090 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
200a0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
200b0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
200c0 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
200d0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
200e0 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
200f0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
20100 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
20110 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
20120 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
20130 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
20140 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20150 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
20160 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
20170 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
20180 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
20190 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
201a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
201b0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
201c0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
201d0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
201e0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
201f0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20200 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
20210 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
20220 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20230 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
20240 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
20250 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20260 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
20270 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
20280 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
20290 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
202a0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
202b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
202c0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
202d0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
202e0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
202f0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
20300 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
20310 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
20320 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
20330 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
20340 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
20350 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
20360 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
20370 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
20380 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
20390 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
203a0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
203b0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
203c0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
203d0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
203e0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
203f0 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
20400 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
20410 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20420 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  noSync = (pPager
20430 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
20440 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b  seJournal) ?1:0;
20450 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
20460 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ync = pPager->no
20470 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61  Sync ?0:1;.  pPa
20480 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
20490 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
204a0 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  RMAL;.  /* pPage
204b0 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
204c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
204d0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
204e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
204f0 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
20500 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
20510 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  = nExtra;.  pPag
20520 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
20530 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
20540 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
20550 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
20560 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20570 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
20580 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
20590 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
205a0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
205b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
205c0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
205d0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
205e0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
205f0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
20600 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20610 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
20620 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  rArg = 0; */.  /
20630 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
20640 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
20650 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
20660 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
20670 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
20680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20690 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
206a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
206b0 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
206c0 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
206d0 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
206e0 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
206f0 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
20700 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
20710 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
20720 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
20730 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
20740 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
20750 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
20760 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
20770 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
20780 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
20790 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
207a0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
207b0 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
207c0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
207d0 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
207e0 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
207f0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
20800 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
20810 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
20820 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
20830 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
20840 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
20850 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
20860 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
20870 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
20880 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
20890 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
208a0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
208b0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
208c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
208d0 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
208e0 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
208f0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
20900 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20910 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
20920 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
20930 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
20940 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
20950 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
20960 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
20970 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
20980 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
20990 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
209a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
209b0 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
209c0 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
209d0 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
209e0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
209f0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
20a00 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
20a10 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
20a20 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
20a30 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
20a40 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
20a50 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
20a60 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
20a70 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
20a80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20a90 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
20aa0 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
20ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
20ac0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
20ad0 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
20ae0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
20af0 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
20b00 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
20b10 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
20b20 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
20b30 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
20b40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20b50 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
20b60 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
20b70 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
20b80 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
20b90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
20ba0 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
20bb0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20bc0 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
20bd0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
20be0 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
20bf0 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
20c00 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
20c10 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
20c20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20c30 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
20c40 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
20c50 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
20c60 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
20c70 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
20c80 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
20c90 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
20ca0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20cb0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
20cc0 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
20cd0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
20ce0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
20cf0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
20d00 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
20d10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
20d20 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
20d30 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
20d40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20d70 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20    int exists;   
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
20da0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
20db0 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sent */..  asser
20dc0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20dd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20de0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
20df0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
20e00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
20e10 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
20e20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
20e30 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
20e40 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
20e50 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
20e60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
20e70 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20e80 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
20e90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20ea0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
20eb0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
20ec0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
20ed0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
20ee0 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
20ef0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
20f00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
20f10 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
20f20 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
20f30 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
20f40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20f50 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
20f60 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
20f70 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  e;..      /* Che
20f80 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
20f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20fa0 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
20fb0 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
20fc0 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
20fd0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
20fe0 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
20ff0 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
21000 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
21010 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
21020 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
21030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21040 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
21050 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21080 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
21090 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
210a0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
210b0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
210c0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
210d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
210e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
210f0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
21100 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
21110 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
21120 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
21130 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
21140 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21150 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
21160 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
21170 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
21180 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
21190 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
211a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
211b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
211c0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
211d0 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
211e0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
211f0 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
21200 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
21210 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
21220 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
21230 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
21240 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
21250 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
21260 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
21270 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
21280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
21290 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
212a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
212b0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
212c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
212d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
212e0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
212f0 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
21300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21310 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21320 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
21330 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
21340 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
21350 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
21360 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
21370 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
21390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
213a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
213b0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
213c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
213d0 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
213e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
213f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21400 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
21410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21420 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
21430 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
21440 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
21450 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
21460 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
21470 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
21480 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
21490 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
214a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
214b0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
214c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
214d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
214e0 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
214f0 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
21500 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
21510 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
21520 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
21530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21540 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
21550 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
21560 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
21570 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
21580 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
21590 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
215a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
215b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
215c0 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
215d0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
215e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
215f0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
21600 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
21610 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
21620 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
21630 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
21640 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
21650 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
21660 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
21670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21680 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
21690 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20  64 iOffset;     
216a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
216b0 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69  yte offset of fi
216c0 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
216d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
216e0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
216f0 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
21700 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69  MDB );..  if( !i
21710 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
21720 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
21730 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21740 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
21750 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
21760 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21770 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21780 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f  ITE_OK;.  }.  iO
21790 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
217a0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
217b0 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  geSize;.  rc = s
217c0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
217d0 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
217e0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
217f0 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b  eSize, iOffset);
21800 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21810 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
21820 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  AD ){.    rc = S
21830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21840 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
21850 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
21860 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
21870 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
21880 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
21890 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
218a0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
218b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
218c0 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43  s));.  }.  CODEC
218d0 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
218e0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  Data, pgno, 3);.
218f0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
21900 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
21910 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
21920 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
21930 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
21940 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
21950 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
21960 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
21970 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
21980 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
21990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
219a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
219b0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
219c0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
219d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
219e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
219f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
21a00 65 6e 65 76 65 72 20 74 68 65 20 75 70 70 65 72  enever the upper
21a10 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 73 20   layer requests 
21a20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61  a database.** pa
21a30 67 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ge is requested,
21a40 20 62 65 66 6f 72 65 20 74 68 65 20 63 61 63 68   before the cach
21a50 65 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  e is checked for
21a60 20 61 20 73 75 69 74 61 62 6c 65 20 70 61 67 65   a suitable page
21a70 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20  .** or any data 
21a80 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
21a90 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 70 65   database. It pe
21aa0 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f  rforms the follo
21ab0 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63  wing.** two func
21ac0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tions:.**.**   1
21ad0 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
21ae0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
21af0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
21b00 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
21b10 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
21b20 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
21b30 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
21b40 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
21b50 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
21b60 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
21b70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
21b80 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
21b90 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
21ba0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
21bb0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
21bc0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
21bd0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
21be0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
21bf0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
21c00 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
21c10 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
21c20 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
21c30 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
21c40 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
21c50 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
21c60 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
21c70 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
21c80 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
21c90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21ca0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
21cb0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
21cc0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
21cd0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
21ce0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
21cf0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
21d00 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
21d10 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
21d20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
21d30 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
21d40 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
21d50 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
21d60 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
21d70 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
21d80 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
21d90 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
21da0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
21db0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
21dc0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
21dd0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
21de0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
21df0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
21e00 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21e10 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
21e20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
21e30 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
21e40 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
21e50 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
21e60 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
21e70 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
21e80 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
21e90 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
21ea0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
21eb0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
21ec0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21ed0 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
21ee0 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
21ef0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
21f00 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
21f10 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
21f20 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
21f30 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
21f40 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
21f50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21f60 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
21f70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21f80 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
21f90 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
21fa0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
21fb0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
21fc0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
21fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
21fe0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
21ff0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
22000 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
22010 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
22020 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
22030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22050 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22060 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
22070 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
22080 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22090 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
220a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
220b0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
220c0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
220d0 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
220e0 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75  ccess, has no ou
220f0 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
22100 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
22110 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72  and is in an err
22120 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69  or-state, this i
22130 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
22140 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
22150 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
22160 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22170 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
22180 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
22190 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
221a0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
221b0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
221c0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
221d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
221e0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
221f0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22200 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
22210 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
22220 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  e .  ){.    if( 
22230 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
22240 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 73 45  fd) ){.      isE
22250 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
22260 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
22270 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
22280 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
22290 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
222a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
222b0 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
222c0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
222d0 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
222e0 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
222f0 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
22300 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
22310 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
22320 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
22330 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
22340 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
22350 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
22360 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
22370 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
22380 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
22390 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
223a0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
223b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
223c0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
223d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
223e0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
223f0 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
22400 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
22410 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
22420 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
22430 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
22440 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
22450 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
22460 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22470 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
22480 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22490 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
224a0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
224b0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
224c0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
224d0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
224e0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
224f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22500 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
22510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22520 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
22530 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
22540 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
22550 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
22560 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
22570 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
22580 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
22590 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
225a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
225b0 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  HARED;.    }.   
225c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
225d0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
225e0 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  OCK );..    /* I
225f0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
22600 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
22610 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
22620 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
22630 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
22640 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
22650 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
22660 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
22670 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
22680 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
22690 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  set ){.      rc 
226a0 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
226b0 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f  pPager, &isHotJo
226c0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
226d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
226e0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
226f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
22700 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
22710 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73  ErrorReset || is
22720 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
22730 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
22740 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
22750 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22760 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
22770 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
22780 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
22790 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
227a0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
227b0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
227c0 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
227d0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
227e0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
227f0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
22800 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
22810 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
22820 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
22830 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
22840 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
22850 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
22860 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
22870 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
22880 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
22890 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
228a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
228b0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
228c0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
228d0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
228e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
228f0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
22900 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
22910 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
22920 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
22930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22940 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
22950 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
22960 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
22970 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
22980 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
22990 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
229a0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
229b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
229c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
229d0 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
229e0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
229f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22a00 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
22a10 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
22a20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22a40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
22a50 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22a60 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
22a70 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
22a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22a90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22aa0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
22ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
22ac0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
22ad0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
22ae0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
22af0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
22b00 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
22b10 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
22b20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22b30 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
22b40 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
22b50 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
22b60 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
22b70 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
22b80 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
22b90 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
22ba0 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
22bb0 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
22bc0 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
22bd0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
22be0 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
22bf0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
22c00 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
22c10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
22c20 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
22c30 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
22c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
22c50 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
22c60 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
22c70 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
22c80 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
22c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
22cb0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
22cc0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
22cd0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
22ce0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
22cf0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
22d00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
22d10 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
22d20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
22d30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
22d40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22d50 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
22d60 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
22d70 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
22d80 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
22d90 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
22da0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22db0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
22dc0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
22dd0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22de0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
22df0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
22e00 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
22e10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22e20 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
22e30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22e40 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
22e50 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
22e60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22e80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
22e90 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
22ea0 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
22eb0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
22ec0 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
22ed0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
22ee0 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22f00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
22f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22f30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
22f50 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
22f60 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
22f70 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73  DO: Why are thes
22f80 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20  e cleared here? 
22f90 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f  Is it necessary?
22fa0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
22fb0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
22fc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
22fd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
22fe0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
22ff0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
23000 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23010 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
23020 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
23030 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
23040 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
23050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
23060 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
23070 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
23080 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
23090 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
230a0 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
230b0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
230c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
230d0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
230e0 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
230f0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
23100 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  t cache..      *
23110 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
23120 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
23130 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  er, 1);.      if
23140 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23150 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23160 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
23170 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
23180 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23190 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
231a0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
231b0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
231c0 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
231d0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
231e0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
231f0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
23200 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
23210 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
23220 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
23230 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
23240 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
23250 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
23260 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
23270 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
23280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
23290 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
232a0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
232b0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
232c0 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
232d0 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
232e0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
232f0 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
23300 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
23310 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
23320 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
23330 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
23340 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
23350 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
23360 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
23370 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
23380 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
23390 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
233a0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
233b0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
233c0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
233d0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
233e0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
233f0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
23400 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
23410 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
23420 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
23430 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
23440 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
23450 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
23460 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
23470 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
23480 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
23490 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
234a0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
234b0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
234c0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
234d0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
234e0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
234f0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
23500 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
23510 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
23520 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
23530 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
23540 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
23550 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
23560 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
23570 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
23580 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
23590 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ers)];.      sql
235a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
235b0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a  nt(pPager, 0);..
235c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
235d0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
235e0 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
235f0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
23600 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23610 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
23620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
23630 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
23640 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23650 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
23660 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
23670 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
23680 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
23690 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
236a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
236b0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
236c0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
236d0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
236e0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
236f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23710 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
23730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
23740 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
23750 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
23760 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
23770 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
23780 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
23790 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
237a0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
237b0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
237c0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
237d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
237e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
237f0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
23800 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
23810 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23820 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a  _SHARED );.  }..
23830 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
23840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23850 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c      /* pager_unl
23860 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
23870 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d   for exclusive m
23880 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ode and in-memor
23890 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  y databases. */.
238a0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
238b0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
238c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
238d0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
238e0 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
238f0 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
23900 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
23910 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
23920 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
23930 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
23940 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
23950 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
23960 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
23970 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
23980 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
23990 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
239a0 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
239b0 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
239c0 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
239d0 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
239e0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
239f0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
23a00 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
23a10 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
23a20 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
23a30 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
23a40 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23a50 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50  )==0).   && (!pP
23a60 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
23a70 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
23a80 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20  ournalOff>0) .  
23a90 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
23aa0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
23ab0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
23ac0 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20  .** Drop a page 
23ad0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75  from the cache u
23ae0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  sing sqlite3Pcac
23af0 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  heDrop()..**.** 
23b00 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
23b10 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70  ere are now no p
23b20 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72 65  ages with refere
23b30 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20  nces to them, a 
23b40 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
23b50 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
23b60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23b70 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73  is removed..*/.s
23b80 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
23b90 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65 20  DropPage(DbPage 
23ba0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
23bb0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
23bc0 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  ager;.  sqlite3P
23bd0 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
23be0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
23bf0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
23c00 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
23c10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
23c20 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
23c30 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
23c40 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
23c50 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
23c60 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
23c70 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
23c80 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
23c90 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
23ca0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
23cb0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
23cc0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
23cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23ce0 74 69 6f 6e 20 63 61 6c 6c 73 20 70 61 67 65 72  tion calls pager
23cf0 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 74 6f 20  SharedLock() to 
23d00 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20  obtain a SHARED 
23d10 6c 6f 63 6b 20 6f 6e 0a 2a 2a 20 74 68 65 20 64  lock on.** the d
23d20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
23d30 73 75 63 68 20 61 20 6c 6f 63 6b 20 6f 72 20 67  such a lock or g
23d40 72 65 61 74 65 72 20 69 73 20 6e 6f 74 20 61 6c  reater is not al
23d50 72 65 61 64 79 20 68 65 6c 64 2e 0a 2a 2a 20 54  ready held..** T
23d60 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 68 6f  his may cause ho
23d70 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
23d80 63 6b 20 6f 72 20 61 20 63 61 63 68 65 20 70 75  ck or a cache pu
23d90 72 67 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  rge. See comment
23da0 73 0a 2a 2a 20 61 62 6f 76 65 20 66 75 6e 63 74  s.** above funct
23db0 69 6f 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c  ion pagerSharedL
23dc0 6f 63 6b 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ock() for detail
23dd0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
23de0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
23df0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
23e00 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
23e10 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
23e20 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
23e30 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
23e40 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
23e50 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
23e60 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
23e70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
23e80 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
23e90 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
23ea0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
23eb0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
23ec0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
23ed0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
23ee0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
23ef0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
23f00 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
23f10 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
23f20 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
23f30 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
23f40 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
23f50 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
23f60 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
23f70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
23f80 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
23f90 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
23fa0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
23fb0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
23fc0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23fd0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
23fe0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
23ff0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
24000 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
24010 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
24020 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
24030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
24040 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
24050 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
24060 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
24070 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
24080 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
24090 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
240a0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
240b0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
240c0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
240d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
240e0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
240f0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
24100 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
24110 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
24120 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
24130 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
24140 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
24150 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
24160 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
24170 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
24180 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24190 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
241a0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
241b0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
241c0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
241d0 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
241e0 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
241f0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
24200 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
24210 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
24220 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
24230 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
24240 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
24250 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
24260 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
24270 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
24280 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74  cache to populat
24290 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  e with the data 
242a0 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
242b0 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
242c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
242d0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
242e0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
242f0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
24300 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
24310 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
24320 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
24330 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
24340 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
24350 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
24360 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
24370 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
24380 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
24390 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
243a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
243b0 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
243c0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
243d0 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
243e0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
243f0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
24400 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
24410 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
24420 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
24430 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
24440 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
24450 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
24460 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
24470 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
24480 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
24490 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
244a0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
244b0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
244c0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
244d0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
244e0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
244f0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
24500 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
24510 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
24520 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
24530 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
24540 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
24550 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
24560 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
24570 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
24580 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
24590 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
245a0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
245b0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
245c0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
245d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
245e0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
245f0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
24600 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
24610 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
24620 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
24630 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
24640 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
24650 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
24660 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
24670 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
24680 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
24690 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
246a0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
246b0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
246c0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
246d0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
246e0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
246f0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
24700 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
24710 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
24720 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
24730 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
24740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24750 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
24760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
24770 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
24780 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
24790 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
247a0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
247b0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
247c0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
247d0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
247e0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
247f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
24800 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
24810 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
24820 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
24830 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
24840 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
24850 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24860 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
24870 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20  AGER_UNLOCK .   
24880 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63      || sqlite3Pc
24890 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
248a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
248b0 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d  .       || pgno=
248c0 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  =1.  );..  /* Th
248d0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
248e0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
248f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24900 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
24910 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
24920 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
24930 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
24940 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
24950 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
24960 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
24970 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
24980 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
24990 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
249a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
249b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
249c0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
249d0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
249e0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
249f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24a00 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
24a10 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
24a20 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
24a30 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
24a40 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
24a50 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
24a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24a70 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
24a80 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
24a90 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
24aa0 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
24ab0 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
24ac0 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
24ad0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
24ae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24af0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
24b00 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
24b10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
24b20 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
24b30 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
24b40 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
24b50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
24b60 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 69  o, 1, &pPg);.  i
24b70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
24b90 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
24ba0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f   pPg->pgno==pgno
24bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24bc0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
24bd0 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  r || pPg->pPager
24be0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==0 );.  if( pPg
24bf0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ->pPager==0 ){. 
24c00 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
24c10 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
24c20 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
24c30 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
24c40 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
24c50 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a  itialized..    *
24c60 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
24c70 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
24c80 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
24c90 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
24ca0 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 72 63   pPager;..    rc
24cb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
24cc0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
24cd0 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
24ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
24d00 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
24d10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24d20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
24d30 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  nMax<(int)pgno |
24d40 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e  | MEMDB || noCon
24d50 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tent ){.      if
24d60 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
24d70 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
24d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
24d90 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
24da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
24db0 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
24dc0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
24dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
24de0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
24df0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
24e00 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
24e10 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
24e20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
24e30 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
24e40 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
24e50 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
24e60 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
24e70 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
24e80 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
24e90 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
24ea0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
24eb0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
24ec0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
24ed0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
24ee0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
24ef0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
24f00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
24f10 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
24f20 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
24f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
24f40 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
24f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24f60 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
24f70 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
24f80 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
24f90 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
24fa0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
24fb0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
24fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
24fd0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
24fe0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
24ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
25000 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
25010 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
25020 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
25030 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
25040 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
25050 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
25060 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
25070 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
25080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
25090 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
250a0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
250b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
250c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
250d0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
250e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
250f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25100 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
25110 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
25120 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
25130 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
25140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  OK ){.        pa
25160 67 65 72 44 72 6f 70 50 61 67 65 28 70 50 67 29  gerDropPage(pPg)
25170 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25180 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
25190 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
251a0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
251b0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
251c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
251d0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
251e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
251f0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
25200 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
25210 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 50 41 47  ache. */.    PAG
25220 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
25230 6e 48 69 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nHit);.  }..  *p
25240 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72  pPage = pPg;.  r
25250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
25270 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
25280 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
25290 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
252a0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
252b0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
252c0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
252d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
252e0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
252f0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25300 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
25310 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
25320 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
25330 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
25340 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
25350 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
25360 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
25370 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
25380 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
25390 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
253a0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
253b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
253c0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
253d0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
253e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
253f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
25400 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
25410 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
25420 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
25430 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
25440 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
25450 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
25460 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
25470 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
25480 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
25490 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
254a0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
254b0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
254c0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
254d0 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
254e0 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
254f0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
25500 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
25510 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
25520 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
25530 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
25540 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
25550 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
25560 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67  OCK).   && (pPag
25570 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
25580 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
25590 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
255a0 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20  E_FULL).  ){.   
255b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
255c0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
255d0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
255e0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
255f0 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
25600 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
25610 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
25620 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
25630 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
25640 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
25650 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
25660 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
25670 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
25680 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
25690 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
256a0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
256b0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
256c0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
256d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
256e0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
256f0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
25700 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
25710 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
25720 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
25730 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
25740 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
25750 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
25760 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
25770 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
25780 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
25790 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  /*.** If the mai
257a0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
257b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
257c0 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74  opened, ensure t
257d0 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a  hat the.** sub-j
257e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
257f0 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20  pen too. If the 
25800 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
25810 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69  not open,.** thi
25820 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
25830 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
25840 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25850 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
25860 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
25870 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20  to plan. .** An 
25880 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
25890 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
258a0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
258b0 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  l to .** sqlite3
258c0 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a  OsOpen() fails..
258d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
258e0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
258f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
25900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25910 4b 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  K;.  if( isOpen(
25920 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
25930 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
25940 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
25950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25960 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
25970 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
25980 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
25990 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
259a0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
259b0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
259c0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
259d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
259e0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
259f0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
25a00 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
25a10 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
25a20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25a30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25a40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
25a50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
25a60 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
25a70 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
25a80 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
25a90 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
25aa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
25ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
25ac0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
25ad0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
25ae0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
25af0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25b00 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
25b10 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
25b20 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
25b30 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
25b40 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
25b50 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
25b60 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
25b70 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
25b80 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
25b90 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
25ba0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
25bb0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
25bc0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
25bd0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
25be0 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
25bf0 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
25c00 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
25c10 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
25c20 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
25c30 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
25c40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
25c50 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
25c60 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
25c70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
25c80 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
25c90 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
25ca0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
25cb0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
25cc0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
25cd0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
25ce0 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
25cf0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
25d00 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
25d10 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
25d20 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
25d30 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
25d40 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
25d50 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
25d60 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
25d70 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
25d80 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
25d90 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
25da0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
25db0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
25dc0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
25dd0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
25de0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
25df0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
25e00 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
25e10 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
25e20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
25e30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
25e40 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
25e50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
25e60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25e70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
25e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25e90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
25ea0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
25eb0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
25ec0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
25ed0 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
25ee0 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
25ef0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
25f00 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
25f10 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
25f20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
25f30 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
25f40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
25f50 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
25f60 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
25f70 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
25f80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25f90 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
25fa0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
25fb0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
25fc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25fd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f  ;.  }..  /* TODO
25fe0 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70  : Is it really p
25ff0 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68  ossible to get h
26000 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56  ere with dbSizeV
26010 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c  alid==0? If not,
26020 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74  .  ** the call t
26030 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o PagerPagecount
26040 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  () can be remove
26050 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  d..  */.  testca
26060 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
26070 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
26080 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26090 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
260a0 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  ;..  pPager->pIn
260b0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
260c0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
260d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
260e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
260f0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
26100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26110 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
26120 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26130 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
26140 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
26150 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
26160 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26170 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
26180 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
26190 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
261a0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
261b0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
261c0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
261d0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
261e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
261f0 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
26200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
26210 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
26220 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
26230 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
26240 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
26250 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
26260 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
26270 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
26280 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26290 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
262a0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
262b0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
262c0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
262d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
262e0 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
262f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26300 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
26310 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26320 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
26330 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
26340 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26350 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
26360 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
26370 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
26380 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
26390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
263a0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
263b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
263c0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
263d0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
263e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
263f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
26400 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
26410 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
26420 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
26430 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
26440 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26450 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
26460 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
26470 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
26480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
26490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
264a0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
264b0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
264c0 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
264d0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
264e0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
264f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
26500 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
26510 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
26520 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
26530 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
26540 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
26550 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
26560 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
26570 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
26580 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
26590 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
265a0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
265b0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
265c0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
265d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
265e0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
265f0 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
26600 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
26610 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
26620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
26640 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
26650 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
26660 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
26670 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
26680 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26690 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
266a0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
266b0 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
266c0 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
266d0 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
266e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
266f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
26700 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
26710 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
26720 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
26730 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
26740 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
26750 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
26760 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
26770 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26780 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
26790 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
267a0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
267b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
267c0 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
267d0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
267e0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
267f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
26800 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
26810 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
26820 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
26830 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
26840 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
26850 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
26860 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
26870 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
26880 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
26890 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
268a0 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
268b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
268c0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
268d0 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
268e0 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
268f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
26900 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
26910 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
26920 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
26930 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
26940 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
26950 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
26960 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
26970 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
26980 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
26990 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
269a0 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  of it..**.** If 
269b0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
269c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
269d0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
269e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
269f0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
26a00 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
26a10 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
26a20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
26a30 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
26a40 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
26a50 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
26a60 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
26a70 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
26a80 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
26a90 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
26aa0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
26ab0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
26ac0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
26ad0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
26ae0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
26af0 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
26b00 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
26b10 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
26b20 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
26b30 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
26b40 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
26b50 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
26b60 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
26b70 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
26b80 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
26b90 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
26ba0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
26bb0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
26bc0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
26bd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26bf0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
26c00 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61  _UNLOCK );.  pPa
26c10 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
26c20 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
26c30 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67  mory;.  if( pPag
26c40 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
26c50 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
26c60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
26c70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
26c80 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
26c90 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
26ca0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
26cb0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
26cc0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
26cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26ce0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
26cf0 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69  rameter.    ** i
26d00 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
26d10 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
26d20 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
26d30 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
26d40 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
26d50 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
26d60 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
26d70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
26d80 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
26d90 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
26da0 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
26db0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
26dc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
26dd0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
26de0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
26df0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
26e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26e10 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
26e20 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
26e30 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69  ESERVED;.      i
26e40 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
26e50 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26e60 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
26e70 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
26e80 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
26e90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
26ea0 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
26eb0 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75  s were successfu
26ec0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70  lly obtained, op
26ed0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  en the journal. 
26ee0 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77     ** file and w
26ef0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
26f00 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f  ournal-header to
26f10 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
26f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26f30 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  K && pPager->use
26f40 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20  Journal.     && 
26f50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26f60 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
26f70 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
26f80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
26f90 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
26fa0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
26fb0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
26fc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26fd0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
26fe0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
26ff0 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
27000 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
27010 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
27020 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
27030 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
27040 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
27050 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
27060 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
27070 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
27080 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
27090 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
270a0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
270b0 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
270c0 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
270d0 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
270e0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
270f0 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
27100 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
27110 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
27120 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
27130 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27140 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
27150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27160 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
27170 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27180 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27190 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
271a0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
271b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
271c0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
271d0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
271e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
271f0 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
27200 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27210 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
27220 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
27230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27240 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27250 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
27260 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
27270 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
27280 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
27290 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
272a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
272b0 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
272c0 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
272d0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
272e0 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
272f0 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
27300 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
27310 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
27320 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
27330 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
27340 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
27350 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
27360 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
27370 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
27380 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
27390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
273a0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
273b0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
273c0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
273d0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
273e0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
273f0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
27400 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
27410 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
27420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
27430 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
27440 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
27450 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
27460 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
27470 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
27480 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
27490 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
274a0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
274b0 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
274c0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
274d0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
274e0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
274f0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
27500 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
27510 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
27520 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
27530 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
27540 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
27550 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
27560 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
27570 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
27580 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
27590 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
275a0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
275b0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
275c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
275d0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
275e0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
275f0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
27600 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
27610 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
27620 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
27630 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
27640 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
27650 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
27660 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
27670 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
27680 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
27690 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
276a0 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
276b0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
276c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
276d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
276e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
276f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27700 50 61 67 65 72 42 65 67 69 6e 28 70 50 61 67 65  PagerBegin(pPage
27710 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75  r, 0, pPager->su
27720 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20  bjInMemory);.   
27730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
27750 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27760 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27770 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
27780 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
27790 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
277a0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
277b0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
277c0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
277d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
277e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
277f0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63  _OFF ){.      rc
27800 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
27810 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27820 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27830 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27840 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
27850 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
27860 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
27870 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
27880 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
27890 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
278a0 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
278b0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
278c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
278d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
278e0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
278f0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
27900 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
27910 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
27920 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
27930 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
27940 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
27950 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f  rnal(pPg) && isO
27960 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27970 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
27980 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
27990 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
279a0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
279b0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
279c0 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
279d0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
279e0 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
279f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
27a00 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
27a10 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
27a20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
27a30 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
27a40 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
27a50 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
27a60 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
27a70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27a80 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
27a90 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
27aa0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61  ) );.        pDa
27ab0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
27ac0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
27ad0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
27ae0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
27af0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
27b00 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
27b10 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
27b20 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
27b30 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
27b40 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
27b50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27b60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27b70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
27b80 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
27b90 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
27ba0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
27bb0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27be0 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
27bf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27c00 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
27c10 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
27c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27c30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27c50 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
27c60 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
27c70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27c80 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
27c90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
27ca0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
27cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27cc0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
27cd0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
27ce0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
27cf0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
27d00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27d10 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
27d20 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
27d30 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
27d40 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
27d50 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
27d60 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
27d70 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
27d80 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
27d90 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
27da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
27db0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
27dc0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
27dd0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
27de0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
27df0 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
27e00 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
27e10 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
27e20 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
27e30 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
27e40 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f  ccurred while jo
27e50 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
27e60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
27e70 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
27e80 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
27e90 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
27ea0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
27eb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
27ec0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
27ed0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
27ee0 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
27ef0 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
27f00 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
27f10 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
27f20 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
27f30 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
27f40 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
27f50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
27f60 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
27f70 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
27f80 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
27f90 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
27fa0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
27fb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27fc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27fd0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
27fe0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
27ff0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
28000 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
28010 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
28020 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
28030 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
28040 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69  has occurred wri
28050 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
28060 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
28070 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
28080 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
28090 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
280a0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
280b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
280c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
280d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
280e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
280f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
28100 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
28110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28120 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
28130 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
28140 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
28150 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
28160 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
28170 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
28180 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
28190 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
281a0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
281b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
281c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
281d0 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
281e0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
281f0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
28200 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
28210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28220 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
28230 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
28240 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
28250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
28280 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
28290 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
282a0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
282b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
282c0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
282d0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
282e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
282f0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
28300 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
28310 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
28320 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
28330 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
28340 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
28350 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
28360 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
28370 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
28380 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
28390 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
283a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
283b0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
283c0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
283d0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
283e0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
283f0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
28400 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
28410 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
28420 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
28430 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
28440 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
28450 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
28460 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
28470 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
28480 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
28490 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
284a0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
284b0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
284c0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
284d0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
284e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
284f0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
28500 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
28510 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
28520 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
28530 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
28540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
28550 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
28560 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
28570 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
28580 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
28590 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
285a0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
285b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
285c0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
285d0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
285e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
285f0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
28600 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
28610 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
28620 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
28630 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
28640 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
28650 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
28660 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
28670 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
28680 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
28690 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
286a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
286b0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
286c0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
286d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
286e0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
286f0 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
28700 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
28710 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
28720 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
28730 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
28740 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
28750 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
28760 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
28770 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
28780 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
28790 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
287a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
287b0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
287c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
287d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
287e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
287f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
28800 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
28810 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
28820 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
28830 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
28840 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
28850 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
28860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28870 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
28880 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
28890 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
288a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
288b0 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
288c0 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
288d0 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
288e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
288f0 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
28900 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
28910 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
28920 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
28930 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
28940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28950 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
28980 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
28990 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
289a0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b  /.    int nPage;
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
289d0 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
289e0 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
289f0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
28a20 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
28a30 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
28a40 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
28a50 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
28a60 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
28a70 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
28a80 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
28a90 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
28aa0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
28ab0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
28ac0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
28ad0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
28ae0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
28af0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
28b00 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
28b10 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
28b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28b30 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
28b40 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
28b50 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
28b60 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
28b70 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
28b80 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
28b90 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
28ba0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
28bb0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
28bc0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
28bd0 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
28be0 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
28bf0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
28c00 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
28c10 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
28c20 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
28c30 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
28c40 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
28c50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
28c60 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ;..    sqlite3Pa
28c70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
28c80 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
28c90 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66  geCount);.    if
28ca0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
28cb0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
28cc0 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
28cd0 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
28ce0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
28cf0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
28d00 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
28d10 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
28d20 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
28d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28d40 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
28d50 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
28d60 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
28d70 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
28d80 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
28d90 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
28da0 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
28db0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
28dc0 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
28dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
28de0 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
28df0 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
28e00 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
28e10 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
28e20 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
28e30 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
28e40 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
28e50 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
28e60 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
28e70 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
28e80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28e90 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
28ea0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
28eb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28ec0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28ed0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28ee0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
28ef0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
28f00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
28f10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28f20 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
28f30 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
28f40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
28f50 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
28f60 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
28f70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
28f90 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
28fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
28fc0 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
28fd0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
28fe0 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
28ff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
29000 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
29010 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
29020 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
29030 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
29040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
29050 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
29060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29070 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
29080 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
29090 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
290a0 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
290b0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
290c0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
290d0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
290e0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
290f0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
29100 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
29110 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
29120 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
29130 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
29140 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
29150 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
29160 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
29170 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
29180 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
29190 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
291a0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
291b0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
291c0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
291d0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
291e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
291f0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
29200 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
29210 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
29220 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
29230 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
29240 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
29250 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
29260 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
29270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
29280 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
29290 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
292a0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
292b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
292c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
292d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
292e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
292f0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
29300 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
29310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29320 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
29330 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
29340 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
29350 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29360 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
29370 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
29380 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29390 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
293a0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
293b0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
293c0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
293d0 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
293e0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
293f0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29400 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
29410 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
29420 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
29430 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
29440 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
29450 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29460 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
29470 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
29480 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
29490 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
294a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
294b0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
294c0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
294d0 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
294e0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
294f0 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
29500 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
29510 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
29520 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
29530 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
29540 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
29550 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
29560 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
29570 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
29580 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
29590 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
295a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
295b0 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
295c0 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
295d0 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
295e0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
295f0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
29600 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
29610 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
29620 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
29630 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
29640 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
29650 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
29660 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
29670 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
29680 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
29690 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
296a0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
296b0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
296c0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
296d0 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
296e0 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
296f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
29700 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
29710 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
29720 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
29730 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
29740 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
29750 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
29760 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
29770 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
29780 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
29790 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
297a0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
297b0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
297c0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
297d0 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
297e0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
297f0 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
29800 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
29810 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
29820 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
29830 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
29840 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
29850 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
29860 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
29870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
29880 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
29890 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
298a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
298b0 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
298c0 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
298d0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
298e0 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
298f0 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
29900 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
29910 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a   pager file..**.
29920 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
29930 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  ct flag is zero,
29940 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
29950 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
29960 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
29970 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
29980 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
29990 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
299a0 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
299b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
299c0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
299d0 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
299e0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
299f0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
29a00 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
29a10 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 6d 61  isDirect flag ma
29a20 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
29a30 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
29a40 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
29a50 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the SQLIT
29a60 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
29a70 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
29a80 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
29a90 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
29aa0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
29ab0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
29ac0 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
29ad0 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
29ae0 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
29af0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
29b00 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
29b10 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
29b20 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
29b30 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
29b40 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
29b50 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
29b60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
29b70 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
29b80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29b90 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63  TE_OK;..  /* Dec
29ba0 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
29bb0 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
29bc0 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
29bd0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
29be0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
29bf0 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
29c00 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
29c10 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
29c20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
29c30 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
29c40 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
29c50 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
29c60 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
29c70 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
29c80 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
29c90 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
29ca0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
29cb0 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
29cc0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
29cd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
29ce0 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
29cf0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
29d00 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
29d10 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
29d20 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
29d30 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
29d40 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
29d50 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
29d60 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
29d70 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
29d80 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
29d90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
29da0 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e 73  MIC_WRITE.  cons
29db0 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d  t int isDirect =
29dc0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   0;.  assert( is
29dd0 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
29de0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29df0 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
29e00 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  );.#else.  const
29e10 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20   int isDirect = 
29e20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23 65  isDirectMode;.#e
29e30 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
29e40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
29e50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
29e60 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
29e70 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
29e80 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
29e90 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
29ea0 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
29eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
29ec0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
29ed0 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
29ee0 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
29ef0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
29f00 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
29f10 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
29f20 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
29f30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29f40 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
29f50 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
29f60 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
29f70 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
29f80 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
29f90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
29fa0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
29fb0 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
29fc0 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
29fd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29fe0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
29ff0 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2a000 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2a010 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2a020 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2a030 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2a040 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2a050 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 0a 20  ge 1 writable.. 
2a060 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2a070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2a080 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
2a090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a0a0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
2a0b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2a0c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a0d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
2a0e0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
2a0f0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
2a100 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
2a110 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
2a120 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
2a130 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
2a140 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
2a150 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
2a160 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
2a170 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
2a180 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2a190 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
2a1a0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
2a1b0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e        /* If runn
2a1c0 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f  ing in direct mo
2a1d0 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f  de, write the co
2a1e0 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31  ntents of page 1
2a1f0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f   to the file. */
2a200 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 72  .      if( isDir
2a210 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ect ){.        c
2a220 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
2a230 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
2a240 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a250 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2a260 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
2a270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a280 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2a290 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2a2a0 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2a2b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2a2c0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
2a2d0 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63 68 61  ked, set the cha
2a2e0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
2a2f0 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g. */.      if( 
2a300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a310 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2a320 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2a330 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2a340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
2a350 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
2a360 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
2a370 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2a380 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
2a390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a3a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
2a3b0 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
2a3c0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
2a3d0 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66   for in-memory f
2a3e0 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73  iles.** or pages
2a3f0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e   with the Pager.
2a400 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e  noSync flag set.
2a410 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a420 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20  sful, or called 
2a430 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77  on a pager for w
2a440 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d  hich it is a no-
2a450 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  op, this.** func
2a460 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2a470 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2a480 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  e, an IO error c
2a490 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2a4a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2a4b0 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
2a4c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2a4d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a500 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c  /.  if( MEMDB ||
2a510 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2a520 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2a530 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2a540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a550 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
2a560 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
2a570 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
2a580 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a590 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
2a5a0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
2a5b0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
2a5c0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
2a5d0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
2a5e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
2a5f0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
2a600 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
2a610 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
2a620 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2a630 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
2a640 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
2a650 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
2a660 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
2a670 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
2a680 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
2a690 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
2a6a0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2a6b0 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
2a6c0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2a6d0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2a6e0 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
2a6f0 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
2a700 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
2a710 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2a720 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2a730 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
2a740 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2a750 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
2a760 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a770 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
2a780 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2a790 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
2a7a0 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
2a7b0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2a7c0 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
2a7d0 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
2a7e0 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
2a7f0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
2a800 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
2a810 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
2a820 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
2a830 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
2a840 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
2a850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
2a860 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
2a870 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2a880 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
2a890 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2a8a0 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
2a8b0 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
2a8c0 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
2a8d0 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
2a8e0 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
2a8f0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
2a900 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
2a910 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
2a920 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
2a930 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
2a940 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2a950 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
2a960 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
2a970 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2a980 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2a990 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
2a9a0 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
2a9b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2a9c0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
2a9d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
2a9e0 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
2a9f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2aa00 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
2aa10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2aa20 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
2aa30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2aa60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2aa70 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
2aa80 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2aa90 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
2aaa0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
2aab0 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aad0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2aae0 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
2aaf0 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
2ab00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ab10 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2ab20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ab30 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  e */..  if( pPag
2ab40 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
2ab50 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
2ab60 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
2ab70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2ab80 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
2ab90 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
2aba0 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
2abb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
2abc0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
2abd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
2abe0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
2abf0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2ac00 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
2ac10 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2ac20 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
2ac30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
2ac40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2ac50 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2ac60 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
2ac70 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2ac80 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
2ac90 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2aca0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
2acb0 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
2acc0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
2acd0 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
2ace0 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  D && pPager->dbM
2acf0 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20  odified ){..    
2ad00 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2ad10 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
2ad20 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2ad30 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
2ad40 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68  t.    ** does th
2ad50 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
2ad60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2ad70 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
2ad80 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2ad90 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
2ada0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2adb0 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
2adc0 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
2add0 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  e .    ** runtim
2ade0 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
2adf0 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
2ae00 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2ae10 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79     * The file-sy
2ae20 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
2ae30 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
2ae40 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
2ae50 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
2ae60 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
2ae70 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20  , and .    **   
2ae80 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
2ae90 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
2aea0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
2aeb0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2aec0 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
2aed0 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
2aee0 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
2aef0 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
2af00 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
2af10 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
2af20 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
2af30 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
2af40 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2af50 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
2af60 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2af70 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
2af80 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
2af90 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
2afa0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69      ** counter i
2afb0 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65  n 'indirect-mode
2afc0 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  '. If the optimi
2afd0 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  zation is compil
2afe0 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a  ed in but.    **
2aff0 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62   is not applicab
2b000 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73  le to this trans
2b010 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c  action, call sql
2b020 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2b030 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e().    ** to ma
2b040 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
2b050 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
2b060 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
2b070 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
2b080 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2b090 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2b0a0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2b0b0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
2b0c0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20  indirect.    ** 
2b0d0 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  mode. .    **.  
2b0e0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2b0f0 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2b100 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
2b110 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
2b120 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  le,.    ** then 
2b130 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
2b140 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2b150 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2b160 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
2b170 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20   ** in 'direct' 
2b180 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2b190 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2b1a0 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ile will never b
2b1b0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2b1c0 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
2b1d0 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  ction..    */.#i
2b1e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2b1f0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2b200 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
2b210 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2b220 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2b230 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2b240 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2b250 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2b260 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
2b270 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
2b280 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26  er->jfd) .     &
2b290 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2b2a0 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
2b2b0 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
2b2c0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2b2d0 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Size>=pPager->db
2b2e0 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26  FileSize.     &&
2b2f0 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
2b300 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2b310 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2b320 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
2b330 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20  pDirty).    ){. 
2b340 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2b350 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
2b360 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
2b370 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
2b380 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
2b390 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
2b3a0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
2b3b0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
2b3c0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2b3d0 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2b3e0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2b3f0 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
2b400 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
2b410 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
2b420 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
2b430 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b440 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
2b450 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2b460 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  e .      ** prop
2b470 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
2b480 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
2b490 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
2b4a0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2b4b0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2b4c0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2b4d0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
2b4e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b4f0 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2b500 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2b510 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b530 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2b540 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2b550 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2b560 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20   }.    }.#else. 
2b570 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2b580 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2b590 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e  (pPager, 0);.#en
2b5a0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
2b5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2b5c0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2b5d0 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2b5e0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
2b5f0 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
2b600 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
2b610 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
2b620 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64  s.    ** being d
2b630 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
2b640 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
2b650 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2b660 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
2b670 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
2b680 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
2b690 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
2b6a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
2b6b0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
2b6c0 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
2b6d0 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
2b6e0 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a   than the .    *
2b6f0 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * current value 
2b700 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
2b710 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b   set dbSize back
2b720 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20   to the value.  
2b730 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
2b740 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
2b750 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2b760 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
2b770 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  e.    ** calls t
2b780 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2b790 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
2b7a0 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
2b7b0 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  of .    ** readi
2b7c0 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
2b7d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2b7e0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2b7f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2b800 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2b810 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
2b820 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
2b830 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2b840 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2b850 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2b860 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  FF .    ){.     
2b870 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2b8a0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2b8b0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2b8c0 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
2b8d0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2b8e0 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
2b8f0 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
2b900 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
2b910 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2b920 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
2b930 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
2b940 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67  e */ .      pPag
2b950 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
2b960 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2b970 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62  .      for( i=db
2b980 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
2b990 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
2b9a0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ++ ){.        if
2b9b0 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
2b9c0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2b9d0 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
2b9e0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
2b9f0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2ba00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2ba10 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
2ba20 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  l */.          r
2ba30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ba40 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
2ba50 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2ba60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ba70 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2ba80 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2ba90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2baa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2bab0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2bac0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2bad0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2bae0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2baf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2bb00 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2bb10 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2bb20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
2bb30 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2bb40 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d   = dbSize;.    }
2bb50 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2bb60 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
2bb70 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
2bb80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2bb90 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
2bba0 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   .    ** journal
2bbb0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
2bbc0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
2bbd0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2bbe0 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a  al file, .    **
2bbf0 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69   or if zMaster i
2bc00 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65  s NULL (no maste
2bc10 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e  r journal), then
2bc20 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
2bc30 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2bc40 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
2bc50 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
2bc60 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
2bc70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bc80 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2bc90 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2bca0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2bcb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2bcc0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
2bcd0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2bce0 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
2bcf0 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
2bd00 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
2bd10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2bd20 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
2bd30 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e  .    ** real IO.
2bd40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2bd50 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2bd60 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
2bd70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2bd80 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2bd90 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2bda0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
2bdb0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
2bdc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2bdd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2bde0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73  write_pagelist(s
2bdf0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2be00 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2be10 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28  Cache));.    if(
2be20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2be30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2be40 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2be50 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
2be60 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68    goto commit_ph
2be70 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2be80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
2be90 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
2bea0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2beb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2bec0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
2bed0 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
2bee0 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2bef0 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74   image,.    ** t
2bf00 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
2bf10 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
2bf20 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
2bf30 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  e here..    */. 
2bf40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2bf50 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64  bSize!=pPager->d
2bf60 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2bf70 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70     Pgno nNew = p
2bf80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20  Pager->dbSize - 
2bf90 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d  (pPager->dbSize=
2bfa0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2bfb0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61  Pager));.      a
2bfc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2bfd0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
2bfe0 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72  USIVE );.      r
2bff0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
2c000 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
2c010 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2c020 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c030 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c040 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  e_exit;.    }.. 
2c050 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
2c060 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2c070 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2c080 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2c090 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
2c0a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c0b0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2c0c0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2c0d0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
2c0e0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
2c0f0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2c100 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
2c110 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c120 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
2c130 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2c140 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
2c150 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
2c160 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
2c170 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2c180 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
2c190 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
2c1a0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 2a   exclusive.    *
2c1b0 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
2c1c0 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
2c1d0 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
2c1e0 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
2c1f0 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e     ** there is n
2c200 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
2c210 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
2c220 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  nt, it is.    **
2c230 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
2c240 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
2c250 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d 20     **/.    rc = 
2c260 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
2c270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c280 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
2c290 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c2a0 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
2c2b0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
2c2c0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
2c2d0 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
2c2e0 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
2c2f0 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
2c300 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
2c310 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
2c320 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
2c330 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
2c340 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
2c350 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
2c360 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
2c370 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
2c380 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
2c390 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
2c3a0 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
2c3b0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
2c3c0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2c3d0 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
2c3e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2c3f0 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
2c400 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2c410 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
2c420 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
2c430 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
2c440 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
2c450 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
2c460 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
2c470 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2c480 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
2c490 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
2c4a0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
2c4b0 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
2c4c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2c4d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2c4e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2c4f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2c500 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
2c510 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2c520 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
2c530 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2c540 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2c550 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2c560 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
2c570 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2c580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2c5b0 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
2c5c0 20 70 72 6f 63 65 65 64 20 69 66 20 74 68 65 20   proceed if the 
2c5d0 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79  pager is already
2c5e0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2c5f0 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ate. */.  if( pP
2c600 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
2c610 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
2c620 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2c630 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2c640 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
2c650 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  be called if the
2c660 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
2c670 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50   at least.  ** P
2c680 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
2c690 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64 20  ate. And indeed 
2c6a0 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f 65  SQLite never doe
2c6b0 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20 69  s this. But it i
2c6c0 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68  s.  ** nice to h
2c6d0 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73 69  ave this defensi
2c6e0 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20 61 6e  ve block here an
2c6f0 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  yway..  */.  if(
2c700 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73   NEVER(pPager->s
2c710 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
2c720 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74 75  VED) ){.    retu
2c730 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2c740 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  .  }..  /* An op
2c750 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2c760 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2c770 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2c780 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2c790 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2c7a0 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2c7b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2c7c0 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2c7d0 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2c7e0 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2c7f0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2c800 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2c810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2c820 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2c830 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2c840 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2c850 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2c860 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2c870 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2c880 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2c890 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2c8a0 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2c8b0 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2c8c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2c8d0 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2c8e0 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2c8f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c900 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2c910 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2c920 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2c930 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2c940 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2c950 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2c960 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2c970 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2c980 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2c990 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
2c9a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2c9b0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
2c9c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
2c9d0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2c9e0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2c9f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2ca00 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
2ca10 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2ca20 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
2ca30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
2ca40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ca50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
2ca60 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
2ca70 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
2ca80 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
2ca90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2caa0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
2cab0 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
2cac0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2cad0 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
2cae0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2caf0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2cb00 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2cb10 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2cb20 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2cb30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
2cb40 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
2cb50 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
2cb60 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
2cb70 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
2cb80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2cb90 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
2cba0 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
2cbb0 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
2cbc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2cbd0 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
2cbe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2cbf0 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
2cc00 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
2cc10 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
2cc20 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
2cc30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
2cc40 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
2cc50 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
2cc60 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
2cc70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
2cc80 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2cc90 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
2cca0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
2ccb0 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
2ccc0 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
2ccd0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
2cce0 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
2ccf0 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
2cd00 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2cd10 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
2cd20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
2cd30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2cd40 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
2cd50 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
2cd60 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2cd70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
2cd80 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
2cd90 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
2cda0 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
2cdb0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2cdc0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2cdd0 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
2cde0 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
2cdf0 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
2ce00 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
2ce10 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
2ce20 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
2ce30 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
2ce40 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
2ce50 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
2ce60 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
2ce70 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
2ce80 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
2ce90 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
2cea0 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
2ceb0 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2cec0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
2ced0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2cee0 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
2cef0 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
2cf00 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
2cf10 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
2cf20 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
2cf30 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
2cf40 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
2cf50 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2cf60 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2cf70 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
2cf80 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
2cf90 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
2cfa0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2cfb0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2cfc0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2cfd0 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
2cfe0 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
2cff0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2d000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
2d010 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
2d020 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
2d030 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
2d040 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
2d050 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
2d060 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
2d070 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
2d080 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
2d090 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
2d0a0 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
2d0b0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
2d0c0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2d0d0 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2d0e0 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
2d0f0 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
2d100 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
2d110 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
2d120 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2d130 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
2d140 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
2d150 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
2d160 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
2d170 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
2d180 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
2d190 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
2d1a0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
2d1b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
2d1c0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2d1d0 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
2d1e0 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
2d1f0 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
2d200 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
2d210 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
2d220 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
2d230 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2d240 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
2d250 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
2d260 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
2d270 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
2d280 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
2d290 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
2d2a0 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
2d2b0 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
2d2c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
2d2d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d2e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
2d2f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d300 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d310 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2d320 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d330 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
2d340 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
2d350 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2d360 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
2d370 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2d380 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
2d390 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2d3a0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2d3b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2d3c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2d3d0 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
2d3e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
2d3f0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2d400 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
2d410 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
2d420 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2d430 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
2d440 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
2d450 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2d460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2d470 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2d490 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2d4a0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2d4b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2d4c0 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
2d4d0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2d4e0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
2d4f0 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
2d500 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2d510 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2d520 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
2d530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d540 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
2d550 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
2d560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2d570 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2d580 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2d590 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
2d5a0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
2d5b0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2d5c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2d5d0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2d5e0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
2d5f0 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
2d600 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
2d610 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2d620 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
2d630 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
2d640 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
2d650 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
2d660 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
2d670 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
2d680 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
2d690 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
2d6a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d6b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2d6c0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
2d6d0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
2d6e0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
2d6f0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2d700 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2d710 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
2d720 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
2d730 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
2d740 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
2d750 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2d760 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
2d770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2d780 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2d790 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2d7a0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2d7b0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2d7c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d7d0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2d7e0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2d7f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2d800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2d810 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2d820 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2d830 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2d840 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d850 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2d860 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
2d870 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2d880 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
2d890 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
2d8a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2d8b0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
2d8c0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2d8d0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
2d8e0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
2d8f0 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
2d900 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
2d910 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
2d920 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
2d930 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2d940 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2d950 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2d960 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
2d970 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2d980 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2d990 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
2d9a0 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
2d9b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d9c0 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
2d9d0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2d9e0 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
2d9f0 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
2da00 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
2da10 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
2da20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2da30 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
2da40 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
2da50 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
2da60 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
2da70 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
2da80 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
2da90 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
2daa0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
2dab0 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
2dac0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
2dad0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2dae0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2daf0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
2db00 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2db10 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
2db20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2db30 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
2db40 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2db50 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
2db60 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
2db70 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
2db80 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
2db90 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
2dba0 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
2dbb0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
2dbc0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
2dbd0 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
2dbe0 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
2dbf0 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
2dc00 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2dc10 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
2dc20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
2dc30 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
2dc40 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2dc50 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
2dc60 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2dc70 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
2dc80 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
2dc90 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
2dca0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
2dcb0 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
2dcc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2dcd0 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
2dce0 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
2dcf0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
2dd00 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
2dd10 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2dd20 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2dd30 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
2dd40 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2dd50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2dd80 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
2dd90 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
2dda0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
2ddb0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
2ddc0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2ddd0 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
2dde0 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
2ddf0 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
2de00 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
2de10 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de30 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2de40 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2de50 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
2de60 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
2de70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2de80 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
2de90 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20  nt array */..   
2dea0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65   /* Either there
2deb0 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f   is no active jo
2dec0 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62  urnal or the sub
2ded0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  -journal is open
2dee0 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   or .    ** the 
2def0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79  journal is alway
2df00 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
2df10 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ry */.    assert
2df20 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2df30 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65  oint==0 || isOpe
2df40 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2df50 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ||.            p
2df60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2df70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2df80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
2df90 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
2dfa0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2dfb0 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
2dfc0 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
2dfd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
2dfe0 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
2dff0 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
2e000 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
2e010 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
2e020 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
2e030 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2e040 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
2e050 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
2e060 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
2e070 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
2e080 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
2e090 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
2e0a0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
2e0b0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
2e0c0 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
2e0d0 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
2e0e0 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
2e0f0 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
2e100 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e110 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2e120 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
2e130 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
2e140 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
2e150 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
2e160 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
2e170 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2e180 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
2e190 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2e1a0 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
2e1b0 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
2e1c0 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
2e1d0 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
2e1e0 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
2e1f0 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
2e200 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
2e210 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2e220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e230 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2e240 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
2e250 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
2e260 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2e270 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2e280 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
2e290 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2e2a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
2e2b0 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
2e2c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2e2d0 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
2e2e0 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2e2f0 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
2e300 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
2e310 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2e320 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
2e330 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  Rec = pPager->nS
2e340 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65  ubRec;.      aNe
2e350 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
2e360 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
2e370 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
2e380 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
2e390 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49  if( !aNew[ii].pI
2e3a0 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
2e3b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e3c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2e3d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2e3e0 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2e3f0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
2e400 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
2e410 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ed. */.    rc = 
2e420 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2e430 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
2e440 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e450 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e460 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
2e470 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2e480 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
2e490 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
2e4a0 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
2e4b0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
2e4c0 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
2e4d0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
2e4e0 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
2e4f0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
2e500 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
2e510 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
2e520 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
2e530 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2e540 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
2e550 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
2e560 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
2e570 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
2e580 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
2e590 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
2e5a0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
2e5b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
2e5c0 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
2e5d0 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
2e5e0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
2e5f0 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
2e600 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
2e610 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
2e620 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2e630 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
2e640 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
2e650 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
2e660 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
2e670 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
2e680 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
2e690 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2e6a0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
2e6b0 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
2e6c0 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
2e6d0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2e6e0 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
2e6f0 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
2e700 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
2e710 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
2e720 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
2e730 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
2e740 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
2e750 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2e760 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2e770 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
2e780 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
2e790 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2e7a0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
2e7b0 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2e7c0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2e7d0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
2e7e0 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
2e7f0 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2e800 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
2e810 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2e820 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
2e830 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
2e840 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
2e850 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
2e860 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
2e870 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
2e880 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2e890 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
2e8a0 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
2e8b0 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
2e8c0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
2e8d0 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
2e8e0 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
2e8f0 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
2e900 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
2e910 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
2e920 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
2e930 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
2e940 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
2e950 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
2e960 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
2e970 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2e980 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2e990 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2e9a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2e9b0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
2e9c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2e9d0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2e9e0 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
2e9f0 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
2ea00 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
2ea10 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
2ea20 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2ea30 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
2ea40 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
2ea50 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2ea60 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
2ea70 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2ea80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ea90 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
2eaa0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2eab0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
2eac0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
2ead0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
2eae0 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
2eaf0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2eb00 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
2eb10 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
2eb20 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2eb30 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2eb40 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2eb50 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
2eb60 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
2eb70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2eb80 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
2eb90 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
2eba0 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
2ebb0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
2ebc0 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
2ebd0 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
2ebe0 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
2ebf0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
2ec00 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
2ec10 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
2ec20 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
2ec30 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
2ec40 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
2ec50 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
2ec60 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
2ec70 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
2ec80 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
2ec90 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41  epoint + (op==SA
2eca0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2ecb0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
2ecc0 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
2ecd0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2ece0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
2ecf0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
2ed00 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2ed10 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2ed20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2ed30 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2ed40 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
2ed50 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
2ed60 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
2ed70 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
2ed80 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2ed90 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
2eda0 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
2edb0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2edc0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2edd0 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
2ede0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
2edf0 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
2ee00 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
2ee10 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
2ee20 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
2ee30 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
2ee40 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
2ee50 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
2ee60 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
2ee70 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
2ee80 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69  NT_ROLLBACK && i
2ee90 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2eea0 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
2eeb0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
2eec0 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
2eed0 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
2eee0 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
2eef0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2ef00 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
2ef10 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
2ef20 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
2ef30 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
2ef40 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
2ef50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2ef60 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20  is a release of 
2ef70 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2ef80 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74  vepoint, truncat
2ef90 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  e .    ** the su
2efa0 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72  b-journal to zer
2efb0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
2efc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77   */.    if( nNew
2efd0 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  ==0 && op==SAVEP
2efe0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20  OINT_RELEASE && 
2eff0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2f000 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2f010 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2f020 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20  _OK );.      rc 
2f030 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
2f040 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
2f050 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
2f060 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
2f070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2f080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f090 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2f0a0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2f0b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2f0c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2f0d0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2f0e0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
2f0f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2f100 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
2f110 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2f120 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
2f130 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
2f140 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
2f150 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
2f160 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
2f170 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2f180 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
2f190 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2f1a0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
2f1b0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2f1c0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
2f1d0 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
2f1e0 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
2f1f0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
2f200 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
2f210 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2f220 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
2f230 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
2f240 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
2f250 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2f260 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
2f270 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2f280 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2f290 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2f2a0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2f2b0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2f2c0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
2f2d0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2f2e0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2f2f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2f300 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
2f310 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
2f320 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
2f330 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
2f340 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
2f350 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
2f360 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
2f370 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
2f380 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2f390 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2f3a0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
2f3b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2f3c0 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
2f3d0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
2f3e0 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
2f3f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
2f400 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
2f410 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
2f420 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
2f430 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2f440 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
2f450 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
2f460 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
2f470 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
2f480 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
2f490 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
2f4a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f4b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
2f4c0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
2f4d0 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
2f4e0 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
2f4f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
2f500 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
2f510 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2f520 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
2f530 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
2f540 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
2f550 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
2f560 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
2f570 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
2f580 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
2f590 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
2f5a0 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
2f5b0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
2f5c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
2f5d0 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
2f5e0 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
2f5f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
2f600 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
2f610 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
2f620 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
2f630 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
2f640 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
2f650 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
2f660 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
2f670 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
2f680 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
2f690 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
2f6a0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
2f6b0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2f6c0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
2f6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
2f6e0 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
2f6f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2f700 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
2f710 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
2f720 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
2f730 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2f740 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
2f750 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
2f760 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
2f770 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
2f780 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
2f790 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
2f7a0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
2f7b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2f7c0 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
2f7d0 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
2f7e0 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
2f7f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2f800 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
2f810 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
2f820 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
2f830 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
2f840 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
2f850 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
2f860 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
2f870 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
2f880 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
2f890 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
2f8a0 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
2f8b0 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
2f8c0 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
2f8d0 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
2f8e0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
2f8f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2f900 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
2f910 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f920 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
2f930 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
2f940 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
2f950 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
2f960 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
2f970 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2f980 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
2f990 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
2f9a0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
2f9b0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
2f9c0 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f9e0 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
2f9f0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
2fa00 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
2fa10 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
2fa20 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
2fa30 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
2fa40 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
2fa50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2fa80 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e  /.  Pgno origPgn
2fa90 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
2faa0 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   /* The original
2fab0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2fac0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2fad0 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
2fae0 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  If the page bein
2faf0 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79  g moved is dirty
2fb00 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65   and has not bee
2fb10 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c  n saved by the l
2fb20 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70  atest.  ** savep
2fb30 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20  oint, then save 
2fb40 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
2fb50 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2fb60 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20   into the .  ** 
2fb70 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e  sub-journal now.
2fb80 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2fb90 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
2fba0 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
2fbb0 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  io:.  **.  **   
2fbc0 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
2fbd0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c  <journal page X,
2fbe0 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20   then modify it 
2fbf0 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20  in memory>.  ** 
2fc00 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
2fc10 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d  e;.  **       <M
2fc20 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f  ove page X to lo
2fc30 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20  cation Y>.  **  
2fc40 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2fc50 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ne;.  **.  ** If
2fc60 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74   page X were not
2fc70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2fc80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65  sub-journal here
2fc90 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20  , it would not. 
2fca0 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
2fcb0 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63  to restore its c
2fcc0 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65  ontents when the
2fcd0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e   "ROLLBACK TO on
2fce0 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  e".  ** statemen
2fcf0 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73  t were is proces
2fd00 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73  sed..  **.  ** s
2fd10 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20  ubjournalPage() 
2fd20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f  may need to allo
2fd30 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74  cate space to st
2fd40 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
2fd50 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d  to.  ** one or m
2fd60 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69  ore savepoint bi
2fd70 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74  tvecs. This is t
2fd80 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66  he reason this f
2fd90 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79  unction.  ** may
2fda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fdb0 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  OMEM..  */.  if(
2fdc0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2fdd0 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73  R_DIRTY .   && s
2fde0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2fdf0 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54  pPg).   && SQLIT
2fe00 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a  E_OK!=(rc = subj
2fe10 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29  ournalPage(pPg))
2fe20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2fe30 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
2fe40 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64  RTRACE(("MOVE %d
2fe50 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
2fe60 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
2fe70 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
2fe80 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2fe90 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e  Pg->pgno, (pPg->
2fea0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2feb0 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f  _SYNC)?1:0, pgno
2fec0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2fed0 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
2fee0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
2fef0 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f  gno, pgno))..  /
2ff00 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2ff10 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
2ff20 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
2ff30 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
2ff40 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
2ff50 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
2ff60 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
2ff70 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
2ff80 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
2ff90 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
2ffa0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
2ffb0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
2ffc0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
2ffd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
2ffe0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
2fff0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
30000 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
30010 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
30020 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
30030 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
30040 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
30050 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
30060 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
30070 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
30080 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
30090 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
300a0 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
300b0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
300c0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
300d0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
300e0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
300f0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
30100 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
30110 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20  HDR_DIRTY );.   
30120 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30130 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
30140 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
30150 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
30160 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
30170 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
30180 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
30190 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
301a0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
301b0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
301c0 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
301d0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
301e0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
301f0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
30200 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
30210 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
30220 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
30230 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
30240 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e   ~PGHDR_NEED_SYN
30250 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  C;.  pPgOld = pa
30260 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
30270 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
30280 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70  rt( !pPgOld || p
30290 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29  PgOld->nRef==1 )
302a0 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
302b0 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  {.    pPg->flags
302c0 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61   |= (pPgOld->fla
302d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
302e0 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NC);.    sqlite3
302f0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
30300 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50  d);.  }..  origP
30310 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
30320 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
30330 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b  Move(pPg, pgno);
30340 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
30350 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
30360 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
30370 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
30380 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
30390 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
303a0 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
303b0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
303c0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
303d0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
303e0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
303f0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
30400 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
30410 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
30420 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
30430 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
30440 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
30450 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
30460 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
30470 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
30480 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
30490 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
304a0 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
304b0 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
304c0 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
304d0 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
304e0 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
304f0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
30500 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
30510 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
30520 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
30530 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
30540 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
30550 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
30560 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
30570 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
30580 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
30590 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
305a0 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
305b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
305c0 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
305d0 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
305e0 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
305f0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
30600 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
30610 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
30620 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
30630 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
30640 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
30650 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
30660 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
30670 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
30680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
30690 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
306a0 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
306b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
306c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
306d0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
306e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
306f0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
30700 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
30710 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
30720 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
30730 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20     */.    PgHdr 
30740 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
30750 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
30760 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
30770 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
30780 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
30790 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
307a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
307b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
307c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
307d0 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64 53  Journal && needS
307e0 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
307f0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
30800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
30810 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
30820 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
30830 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20  edSyncPgno);.   
30840 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
30850 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
30860 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
30870 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
30880 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
30890 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
308a0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
308b0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
308c0 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74  _SYNC;.    sqlit
308d0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
308e0 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
308f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
30900 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
30910 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20   /*.  ** For an 
30920 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
30930 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  se, make sure th
30940 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
30950 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74  continues.  ** t
30960 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65  o exist, in case
30970 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
30980 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62   needs to roll b
30990 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63 61 74  ack.  We allocat
309a0 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
309b0 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  now, instead of 
309c0 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62 65 63  at rollback, bec
309d0 61 75 73 65 20 77 65 20 63 61 6e 20 62 65 74 74  ause we can bett
309e0 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77 69 74  er deal.  ** wit
309f0 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  h an out-of-memo
30a00 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20 20 54  ry error now.  T
30a10 69 63 6b 65 74 20 23 33 37 36 31 2e 0a 20 20 2a  icket #3761..  *
30a20 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
30a30 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4e 65  .    DbPage *pNe
30a40 77 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  w;.    rc = sqli
30a50 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
30a60 70 50 61 67 65 72 2c 20 6f 72 69 67 50 67 6e 6f  pPager, origPgno
30a70 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20 20 20  , &pNew, 1);.   
30a80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30a90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
30aa0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30ab0 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20 20 7d  Unref(pNew);.  }
30ac0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
30ad0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
30ae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
30af0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
30b00 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
30b10 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
30b20 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
30b30 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
30b40 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
30b50 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  pPg->nRef>0 || p
30b60 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44  Pg->pPager->memD
30b70 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  b );.  return pP
30b80 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a  g->pData;.}../*.
30b90 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
30ba0 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
30bb0 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
30bc0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
30bd0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
30be0 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
30bf0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
30c00 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
30c10 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
30c20 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
30c30 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
30c40 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
30c50 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78  (pPager?pPg->pEx
30c60 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tra:0);.}../*.**
30c70 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
30c80 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
30c90 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
30ca0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
30cb0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
30cc0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
30cd0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
30ce0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
30cf0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
30d00 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
30d10 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
30d20 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
30d30 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
30d40 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
30d50 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
30d60 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
30d70 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
30d80 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
30d90 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
30da0 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
30db0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
30dc0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
30dd0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
30de0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
30df0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
30e00 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
30e10 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
30e20 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
30e30 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
30e40 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
30e50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30e60 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
30e70 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
30e80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
30e90 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
30ea0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
30eb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
30ec0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
30ed0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
30ee0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
30ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
30f00 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
30f10 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
30f20 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
30f30 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
30f40 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
30f50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30f60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
30f70 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
30f80 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
30f90 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
30fa0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
30fb0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
30fc0 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
30fd0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
30fe0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
30ff0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
31000 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
31010 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31020 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
31030 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
31040 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
31050 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
31060 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
31070 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
31080 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
31090 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
310a0 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
310b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
310c0 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  Y.**.** If the p
310d0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
310e0 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
310f0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73   journal_mode is
31100 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
31110 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69  alue specified i
31120 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20  f the change is 
31130 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68  allowed.  The ch
31140 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77  ange is disallow
31150 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f  ed.** for the fo
31160 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
31170 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69  .**.**   *  An i
31180 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
31190 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20  e can only have 
311a0 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  its journal_mode
311b0 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20   set to _OFF.** 
311c0 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e       or _MEMORY.
311d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
311e0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79  journal mode may
311f0 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20   not be changed 
31200 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74  while a transact
31210 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
31220 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
31230 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
31240 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
31250 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61   updated) journa
31260 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
31270 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
31280 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
31290 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
312a0 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
312b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
312c0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
312d0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
312e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
312f0 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
31300 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
31310 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31320 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
31330 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31340 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
31350 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
31360 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31370 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
31380 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
31390 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
313a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
313b0 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65  MEMORY );.  asse
313c0 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
313d0 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  LMODE_QUERY<0 );
313e0 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a  .  if( eMode>=0.
313f0 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c     && (!MEMDB ||
31400 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
31410 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
31420 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31430 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
31440 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
31450 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e  .   && !pPager->
31460 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26  dbModified.   &&
31470 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   (!isOpen(pPager
31480 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61  ->jfd) || 0==pPa
31490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
314a0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  .  ){.    if( is
314b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
314c0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
314d0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
314e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  ->jfd);.    }.  
314f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
31500 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  lMode = (u8)eMod
31510 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
31520 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75  (int)pPager->jou
31530 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  rnalMode;.}../*.
31540 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73  ** Get/set the s
31550 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66  ize-limit used f
31560 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
31570 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
31580 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73  ** Setting the s
31590 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20  ize limit to -1 
315a0 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69  means no limit i
315b0 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41  s enforced..** A
315c0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74  n attempt to set
315d0 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72   a limit smaller
315e0 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f   than -1 is a no
315f0 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  -op..*/.i64 sqli
31600 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
31610 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
31620 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
31630 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
31640 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
31650 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
31660 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
31670 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
31680 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
31690 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Limit;.}../*.** 
316a0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
316b0 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e   to the pPager->
316c0 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65  pBackup variable
316d0 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64  . The backup mod
316e0 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70  ule.** in backup
316f0 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65  .c maintains the
31700 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
31710 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20   variable. This 
31720 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69  module.** uses i
31730 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e  t opaquely as an
31740 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
31750 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
31760 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74  t() and.** sqlit
31770 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29  e3BackupUpdate()
31780 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65   only..*/.sqlite
31790 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74  3_backup **sqlit
317a0 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72  e3PagerBackupPtr
317b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
317c0 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65  .  return &pPage
317d0 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23  r->pBackup;.}..#
317e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
317f0 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.