/ Hex Artifact Content
Login

Artifact f53ff4e74071cd99a8a1af55712886b82910d0e2:


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 34  : pager.c,v 1.54
0350: 37 20 32 30 30 39 2f 30 31 2f 31 30 20 31 37 3a  7 2009/01/10 17:
0360: 35 37 3a 34 39 20 64 61 6e 69 65 6c 6b 31 39 37  57:49 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1120: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1130: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1140: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1150: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1160: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1170: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1180: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1190: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
11a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
11b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
11c0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
11d0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
11e0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
11f0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
1200: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
1210: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1220: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
1230: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
1240: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1250: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1260: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1290: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
12a0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
12b0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
12c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
12d0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
12e0: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
12f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
1300: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
1310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
1330: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
1340: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
1350: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
1360: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
1370: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1380: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
13a0: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13b0: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
13c0: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
13d0: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
13e0: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
13f0: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1400: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1410: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
1420: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
1430: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1440: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
1450: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
1460: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1470: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1480: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1490: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
14a0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
14b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
14c0: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
14d0: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
14e0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
14f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1500: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1510: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
1520: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1530: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
1540: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
1550: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
1560: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
1570: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1580: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1590: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
15a0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
15b0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
15c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15d0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15e0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
15f0: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1600: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1610: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1620: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
1630: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1640: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
1650: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
1660: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
1670: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1680: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1690: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
16a0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
16b0: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
16c0: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
16d0: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
16e0: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
16f0: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1700: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1710: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
1720: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
1730: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
1760: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
1770: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1780: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1790: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
17a0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
17b0: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
17c0: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
17d0: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
17e0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
17f0: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1810: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
1820: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
1830: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1850: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
1860: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
1870: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1880: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1890: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
18a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
18c0: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
18d0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
18e0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
18f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1900: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
1910: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
1920: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
1930: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
1940: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
1950: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
1960: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
1970: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
1980: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
1990: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
19a0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
19b0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
19c0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
19d0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
19e0: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
19f0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
1a00: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
1a10: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
1a20: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
1a30: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
1a40: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1a50: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
1a60: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
1a70: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
1a80: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
1a90: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a  successfully..**
1aa0: 0a 2a 2a 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  .** Managing the
1ab0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1ac0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1ad0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ae0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1af0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b00: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
1b10: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1b20: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
1b30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6d 61 67  database.** imag
1b40: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
1b50: 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64 61 74  ains. As the dat
1b60: 61 62 61 73 65 20 69 6d 61 67 65 20 67 72 6f 77  abase image grow
1b70: 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74 68 69  s or shrinks thi
1b80: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73  s.** variable is
1b90: 20 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61   updated. The va
1ba0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46  riable Pager.dbF
1bb0: 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73  ileSize contains
1bc0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1bd0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1be0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bf0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1c00: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1c10: 62 53 69 7a 65 0a 2a 2a 20 69 66 20 73 6f 6d 65  bSize.** if some
1c20: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1c30: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1c40: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1c50: 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74  but not yet writ
1c60: 74 65 6e 0a 2a 2a 20 6f 75 74 20 66 72 6f 6d 20  ten.** out from 
1c70: 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1c80: 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20   actual file on 
1c90: 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68 65 20  disk. Or if the 
1ca0: 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e 0a 2a  image has been.*
1cb0: 2a 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61  * truncated by a
1cc0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1cd0: 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cuum operation. 
1ce0: 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67  The Pager.dbOrig
1cf0: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
1d00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1d10: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d30: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d40: 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
1d50: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
1d60: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
1d70: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
1d80: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
1d90: 2a 2a 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  ** only guarante
1da0: 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74  ed to be correct
1db0: 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   if the boolean 
1dc0: 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61 6c 69  Pager.dbSizeVali
1dd0: 64 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  d is true..*/.st
1de0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
1df0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1e00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
1e10: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
1e20: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
1e30: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
1e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e50: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
1e60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
1e70: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
1e80: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
1e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ea0: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
1eb0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
1ec0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
1ed0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1ee0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
1ef0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
1f00: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
1f10: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1f30: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
1f40: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
1f50: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f70: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
1f80: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
1f90: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
1fa0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1fb0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
1fc0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
1fd0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
1fe0: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
1ff0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2000: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
2010: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
2020: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
2030: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2040: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2050: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2060: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2070: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2090: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
20a0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
20b0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
20c0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
20d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20e0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
20f0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2100: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2110: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2120: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2130: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2140: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2150: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2160: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2170: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2180: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2190: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
21c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
21d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2200: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2210: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2220: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2240: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
2250: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
2260: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
2270: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
2280: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2290: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
22a0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
22b0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
22c0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20   journalMode;   
22d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20            /* On 
22e0: 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55  of the PAGER_JOU
22f0: 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65  RNALMODE_* value
2300: 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69  s */.  u8 dbModi
2310: 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  fied;           
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2330: 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61 6e  ere are any chan
2340: 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a 2f  ges to the Db */
2350: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
2360: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
2370: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
2380: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
2390: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
23a0: 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b   u8 dbSizeValid;
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c0: 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20  Set when dbSize 
23d0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20  is correct */.  
23e0: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2400: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2410: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2420: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
2430: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2440: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
2450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2460: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
2470: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
2480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2490: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24b0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
24c0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
24d0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
24e0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
24f0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  n() */.  int err
2500: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
2510: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
2520: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
2530: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
2540: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2550: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2560: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2570: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2580: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2590: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
25a0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
25b0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
25c0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
25d0: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
25e0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
25f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2600: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2610: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2620: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2640: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2650: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2660: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2670: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2690: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
26a0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
26b0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
26c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
26d0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
26e0: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
26f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2710: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2720: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
2730: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
2740: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
2750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2760: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
2770: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2780: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
2790: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
27a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
27b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
27c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 41 6c  */.  Bitvec *pAl
27e0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
27f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
2800: 65 61 63 68 20 70 61 67 65 20 6d 61 72 6b 65 64  each page marked
2810: 20 61 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b   always-rollback
2820: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
2830: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2860: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
2870: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2880: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
2890: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
28a0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
28b0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
28c0: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
28d0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
28e0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73  nal files */.  s
28f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
2900: 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69   *jfd;     /* Fi
2910: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
2920: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
2930: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
2940: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2960: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
2970: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2a  the sub-journal*
2980: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
2990: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
29a0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
29b0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
29c0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
29d0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
29e0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
29f0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
2a00: 6c 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ler */.  i64 jou
2a10: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
2a20: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a30: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
2a40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a50: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2a60: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2a70: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
2a80: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
2a90: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
2aa0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2ac0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
2ad0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
2ae0: 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ck */.#ifdef SQL
2af0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
2b00: 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20  Hit, nMiss;     
2b10: 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20         /* Cache 
2b20: 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67  hits and missing
2b30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c   */.  int nRead,
2b40: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
2b50: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
2b60: 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e  ges read/written
2b70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
2b80: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
2b90: 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c  bPage*); /* Call
2ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2bb0: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
2bc0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
2bd0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
2be0: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
2bf0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2c00: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2c10: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2c20: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2c30: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2c40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2c50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2c60: 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  dec() */.#endif.
2c70: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
2c80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2c90: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2ca0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
2cb0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
2cc0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
2cd0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
2ce0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2d00: 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a  anges */.  i64 j
2d10: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
2d20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c         /* Size l
2d30: 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74  imit for persist
2d40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2d50: 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  s */.  PCache *p
2d60: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
2d70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d80: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
2d90: 63 74 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  ct */.  PagerSav
2da0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
2db0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
2dc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
2dd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
2de0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
2df0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
2e10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 7d 3b 0a 0a  epoint[] */.};..
2e20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2e30: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
2e40: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
2e50: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
2e60: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
2e70: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
2e80: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
2e90: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
2ea0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
2eb0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
2ec0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
2ed0: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
2ee0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2ef0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
2f00: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
2f10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
2f20: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
2f30: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
2f40: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2f50: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
2f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
2f70: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
2f80: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
2f90: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2fa0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
2fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2fc0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
2fd0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
2fe0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
2ff0: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
3000: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
3010: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
3020: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
3030: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
3040: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
3050: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
3060: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
3070: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
3080: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
3090: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
30a0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
30b0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
30c0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
30d0: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
30e0: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
30f0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
3100: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
3110: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
3120: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
3130: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
3140: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
3150: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
3160: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
3170: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
3180: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
3190: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
31a0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
31b0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
31c0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
31d0: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
31e0: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
31f0: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
3200: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
3210: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
3220: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
3230: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
3240: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
3250: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
3260: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
3270: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
3280: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
3290: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
32a0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
32b0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
32c0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
32d0: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
32e0: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
32f0: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
3300: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
3310: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3320: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
3330: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
3340: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
3350: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
3360: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
3370: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
3380: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3390: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
33a0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
33b0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
33c0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
33d0: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
33e0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
33f0: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
3400: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
3410: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
3420: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
3430: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
3440: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
3450: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
3460: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
3470: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
3480: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
3490: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
34a0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
34b0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
34c0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
34d0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
34e0: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
34f0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
3500: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
3510: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
3520: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
3530: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
3550: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
3560: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
3570: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
3580: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
3590: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
35a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
35b0: 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20  der and of each 
35c0: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
35d0: 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nal is determine
35e0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c  d.** by the foll
35f0: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f  owing macros..*/
3600: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3610: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
3620: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
3630: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
3640: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
3650: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
3660: 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66   pager. In the f
3670: 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c  uture, this coul
3680: 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73  d be.** set to s
3690: 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  ome value read f
36a0: 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e  rom the disk con
36b0: 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70  troller. The imp
36c0: 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63  ortant.** charac
36d0: 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74  teristic is that
36e0: 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   it is the same 
36f0: 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73  size as a disk s
3700: 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ector..*/.#defin
3710: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
3720: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
3730: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
3740: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
3750: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
3760: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
3770: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
3780: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
3790: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
37a0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
37b0: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
37c0: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
37d0: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
37e0: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
37f0: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
3800: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
3810: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
3820: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
3830: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
3840: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
3850: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3860: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
3870: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
3880: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
3890: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
38a0: 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72  *.** Page number
38b0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69   PAGER_MJ_PGNO i
38c0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20  s never used in 
38d0: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
38e0: 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73  se (it is.** res
38f0: 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e  erved for workin
3900: 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f  g around a windo
3910: 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61  ws/posix incompa
3920: 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73  tibility). It is
3930: 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20  .** used in the 
3940: 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69  journal to signi
3950: 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  fy that the rema
3960: 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  inder of the jou
3970: 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73  rnal file .** is
3980: 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72   devoted to stor
3990: 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
39a0: 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72  rnal name - ther
39b0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61  e are no more pa
39c0: 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62  ges to.** roll b
39d0: 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ack. See comment
39e0: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77  s for function w
39f0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
3a00: 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  l() for details.
3a10: 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50  .*/./* #define P
3a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3a30: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
3a40: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a  x)->pageSize)) *
3a50: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3a60: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 67 6e  MJ_PGNO(x) ((Pgn
3a70: 6f 29 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  o)((PENDING_BYTE
3a80: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3a90: 29 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  )+1))../*.** The
3aa0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
3ab0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
3ac0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
3ad0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
3ae0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
3af0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3b00: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
3b10: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
3b20: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
3b30: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
3b40: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
3b50: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
3b60: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
3b70: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
3b80: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
3b90: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
3ba0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
3bb0: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
3bc0: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
3bd0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
3be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
3bf0: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
3c00: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
3c10: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
3c20: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
3c30: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
3c40: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
3c50: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
3c60: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
3c70: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
3c80: 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  pPg){.  Pgno pgn
3c90: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
3ca0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
3cb0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
3cc0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3cd0: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
3ce0: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
3cf0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
3d00: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
3d10: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
3d20: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
3d30: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
3d40: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e  e3BitvecTest(p->
3d50: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
3d60: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
3d70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3d80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3d90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3da0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
3db0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
3dc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
3dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3de0: 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  InJournal(PgHdr 
3df0: 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
3e00: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
3e10: 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  t(pPg->pPager->p
3e20: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
3e30: 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
3e40: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
3e50: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
3e60: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
3e70: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
3e80: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
3e90: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
3ea0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3eb0: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
3ec0: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
3ed0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
3ee0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
3ef0: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
3f00: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
3f10: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
3f20: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
3f30: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
3f40: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
3f50: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
3f60: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
3f70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
3f80: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
3f90: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3fa0: 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29  , ac, sizeof(ac)
3fb0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
3fc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3fd0: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71  {.    *pRes = sq
3fe0: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63  lite3Get4byte(ac
3ff0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4000: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4010: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4020: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
4030: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
4040: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
4050: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75  r..*/.#define pu
4060: 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71  t32bits(A,B)  sq
4070: 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75  lite3Put4byte((u
4080: 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57  8*)A,B)../*.** W
4090: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
40a0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
40b0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
40c0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
40d0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
40e0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
40f0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4100: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4120: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
4130: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
4140: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
4150: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
4160: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
4170: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
4180: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
4190: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
41a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ;.}../*.** If fi
41b0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
41c0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
41d0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
41e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
41f0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
4200: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
4210: 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e  k){.  if( !pFd->
4220: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
4230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
4250: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
4260: 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  Fd, eLock);.}../
4270: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4280: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
4290: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
42a0: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
42b0: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61  timization.** ca
42c0: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
42d0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f  his pager. The o
42e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
42f0: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
4300: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
4310: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
4320: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
4330: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
4340: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
4350: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
4360: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
4370: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
4380: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
4390: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
43a0: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
43b0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
43c0: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
43d0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
43e0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
43f0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
4400: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
4410: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
4420: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
4430: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
4440: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
4450: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4460: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
4470: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
4480: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
4490: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
44a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
44b0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
44c0: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
44d0: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
44e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63  Pager){.  int dc
44f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
4500: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
4510: 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  stics */.  int n
4520: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20  Sector;      /* 
4530: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
4540: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
4550: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
4560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4570: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
4580: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
4590: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
45a0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
45b0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
45c0: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
45d0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
45e0: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
45f0: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
4600: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
4610: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
4620: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
4630: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
4640: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
4650: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
4660: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
4670: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
4680: 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20 28   .       (dc & (
4690: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
46a0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
46b0: 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50   && nSector<=szP
46c0: 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  age) ){.    retu
46d0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
46e0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
46f0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4700: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4710: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
4720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4730: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
4740: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
4750: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
4760: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
4770: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
4780: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
4790: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
47a0: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
47b0: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
47c0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
47d0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
47e0: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
47f0: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
4800: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
4810: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4820: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4830: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
4840: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
4850: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
4860: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
4870: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
4880: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
4890: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
48a0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
48b0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
48c0: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
48d0: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
48e0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
48f0: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
4900: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
4910: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
4920: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
4930: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
4940: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
4950: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
4960: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
4970: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
4980: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
4990: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
49a0: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
49b0: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
49c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
49d0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
49e0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
49f0: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
4a00: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
4a10: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65  ent error occure
4a20: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
4a30: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
4a40: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
4a50: 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74  eplayed..*/.stat
4a60: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
4a70: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
4a80: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  er);.static int 
4a90: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
4aa0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
4ab0: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
4ac0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
4ad0: 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
4ae0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4af0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4b00: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4b10: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
4b20: 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
4b30: 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
4b40: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
4b50: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
4b60: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
4b70: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4b80: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
4b90: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
4ba0: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
4bb0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
4bc0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
4bd0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
4be0: 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73  NLOCK .     && s
4bf0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
4c00: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
4c10: 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b  ache)==0 .    ){
4c20: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4c30: 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
4c40: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c  y unlocked, call
4c50: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
4c60: 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  now to.      ** 
4c70: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
4c80: 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65  state and ensure
4c90: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d   that the pager-
4ca0: 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20  cache is .      
4cb0: 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  ** completely em
4cc0: 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  pty..      */.  
4cd0: 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
4ce0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
4cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
4d10: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
4d20: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
4d30: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
4d40: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
4d50: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
4d60: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
4d70: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4d80: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
4d90: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
4da0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
4db0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4dc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
4dd0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
4de0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
4df0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
4e00: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
4e10: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
4e20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4e30: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
4e40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4e50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
4e60: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4e70: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
4e80: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
4e90: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
4ea0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4eb0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
4ec0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
4ed0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
4ee0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
4ef0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
4f00: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
4f10: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
4f20: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
4f30: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
4f40: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
4f50: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
4f60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
4f70: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
4f80: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
4f90: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
4fa0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
4fb0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
4fc0: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
4fd0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
4fe0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
4ff0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5000: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
5010: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
5020: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
5030: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
5040: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
5050: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
5060: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5070: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5080: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5090: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
50a0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
50b0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
50c0: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
50d0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
50e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a  pPager->errCode.
50f0: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
5100: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
5110: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
5120: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
5130: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
5140: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
5150: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
5160: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5170: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5180: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5190: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
51a0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
51b0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
51c0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
51d0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
51e0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
51f0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
5200: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
5210: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5220: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
5230: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
5240: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
5250: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
5260: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
5270: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
5280: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
5290: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
52a0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
52b0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
52c0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
52d0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
52e0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
52f0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
5300: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
5310: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
5320: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
5330: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
5340: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
5350: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
5360: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
5370: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
5380: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
5390: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
53a0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
53b0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
53c0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
53d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
53e0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
53f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
5400: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
5410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5420: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
5430: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5440: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
5450: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5470: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5480: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5490: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
54a0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
54b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
54c0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
54d0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
54e0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
54f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5500: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5510: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5520: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5530: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5540: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5550: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5560: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
5570: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5580: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
5590: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
55a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
55b0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
55c0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
55d0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
55e0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
55f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5600: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5610: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5620: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5630: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5640: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5650: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5660: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5690: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
56a0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
56b0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
56c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
56d0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
56e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
56f0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5710: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5720: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5730: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5750: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5760: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
5770: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
5780: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5790: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
57a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
57b0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
57c0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
57d0: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
57e0: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
57f0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5800: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5810: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5820: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5830: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5840: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5850: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5860: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5870: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5880: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5890: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
58a0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
58b0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
58c0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
58d0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
58e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
58f0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5900: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5910: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5940: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5950: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5960: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5970: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5980: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5990: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
59a0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
59b0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
59c0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
59d0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
59e0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
59f0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5a00: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5a10: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5a20: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5a30: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5a60: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5a70: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5a80: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
5a90: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5aa0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
5ab0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5ac0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5ae0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
5af0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
5b00: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
5b10: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5b20: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5b30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5b40: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5b50: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5b60: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5b70: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5b80: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5b90: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5ba0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5bb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5bc0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5bd0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5bf0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5c00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5c10: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
5c20: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5c30: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5c40: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5c50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5c60: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
5c70: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a  }../*.** Write z
5c90: 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65  eros over the he
5ca0: 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
5cb0: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
5cc0: 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63  has the.** effec
5cd0: 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e  t of invalidatin
5ce0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
5cf0: 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e  le and committin
5d00: 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  g the.** transac
5d10: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5d20: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
5d30: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5d40: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
5d50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5d60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
5d70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
5d80: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
5d90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
5da0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
5db0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
5dc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
5dd0: 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54  eLimit;..    IOT
5de0: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
5df0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
5e00: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
5e10: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
5e20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5e30: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
5e40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
5e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5e70: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
5e80: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
5e90: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
5ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
5eb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5ec0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
5ed0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5ee0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
5ef0: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
5f00: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
5f10: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
5f20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5f30: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
5f40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5f50: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
5f60: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
5f70: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
5f80: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
5f90: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
5fa0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
5fb0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
5fc0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
5fd0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
5fe0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
5ff0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
6000: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
6010: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
6020: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
6030: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
6040: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
6050: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
6060: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
6070: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
6080: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
6090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
60a0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
60b0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
60c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
60d0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
60e0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
60f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6100: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
6110: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
6120: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
6130: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
6140: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
6150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6160: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6170: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6180: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6190: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
61a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
61b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
61c0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
61d0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
61e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
61f0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
6200: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
6210: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
6220: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
6230: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
6240: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6250: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
6260: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
6270: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
6280: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
6290: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
62a0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
62b0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
62c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
62d0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
62e0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
62f0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6300: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
6310: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
6320: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6330: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6340: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6350: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6360: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
6370: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
6380: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
6390: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
63a0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
63b0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
63c0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
63d0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
63e0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
63f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
6400: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
6410: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
6420: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
6430: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
6440: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
6450: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a 20  .  u32 nWrite;. 
6460: 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28 20   int ii;..  if( 
6470: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
6480: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
6490: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
64a0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
64b0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
64c0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
64d0: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
64e0: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
64f0: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 73 69   were created si
6500: 6e 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f 73  nce the.  ** mos
6510: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
6520: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
6530: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
6540: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
6550: 48 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65 6c  HdrOff.  ** fiel
6560: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
6570: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
6580: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
6590: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
65a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
65b0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
65c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
65d0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
65e0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
65f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6600: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
6610: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
6620: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
6630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
6640: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6650: 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a  Off;..  memcpy(z
6660: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
6670: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6680: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
6690: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
66a0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
66b0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
66c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
66d0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
66e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
66f0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
6700: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
6710: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
6720: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
6730: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
6740: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
6750: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
6760: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
6770: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
6780: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
6790: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
67a0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
67b0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
67c0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
67d0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
67e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
67f0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
6800: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
6810: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
6820: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
6830: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
6840: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
6850: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
6860: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
6870: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
6880: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6890: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
68a0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
68b0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
68c0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
68d0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
68e0: 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
68f0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
6900: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
6910: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
6920: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
6930: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
6940: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
6950: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
6960: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
6970: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
6980: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
6990: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
69a0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
69b0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
69c0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
69d0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
69e0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
69f0: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
6a00: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
6a10: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
6a20: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
6a30: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
6a40: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
6a50: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
6a60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6a70: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
6a80: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
6a90: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
6aa0: 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28  noSync);.  if( (
6ab0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
6ac0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
6ad0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
6ae0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
6af0: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
6b00: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
6b10: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
6b20: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
6b30: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
6b40: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
6b50: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6b70: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
6b80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
6b90: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6ba0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6bb0: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
6bc0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
6bd0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6be0: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6bf0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
6c00: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
6c10: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
6c20: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6c30: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
6c40: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6c50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
6c60: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
6c70: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
6c80: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
6c90: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
6ca0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6cb0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6cc0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
6cd0: 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  OrigSize);.  /* 
6ce0: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6cf0: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6d00: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6d10: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6d20: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6d30: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6d40: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6d50: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
6d60: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
6d70: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
6d80: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
6d90: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
6da0: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
6db0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
6dc0: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
6dd0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
6de0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
6df0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
6e00: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
6e10: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
6e20: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
6e30: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
6e40: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
6e50: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
6e60: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6e70: 61 67 69 63 29 2b 31 36 5d 2c 20 30 2c 0a 20 20  agic)+16], 0,.  
6e80: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
6e90: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6ea0: 61 67 69 63 29 2b 31 36 29 29 3b 0a 0a 20 20 69  agic)+16));..  i
6eb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6ec0: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
6ed0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
6ee0: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
6ef0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6f00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6f10: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
6f20: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
6f30: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
6f40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
6f50: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
6f60: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
6f70: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
6f80: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
6f90: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
6fa0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
6fb0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
6fc0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
6fd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6fe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6ff0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
7000: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
7010: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7020: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
7030: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
7040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7050: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7060: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7070: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
7080: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
7090: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
70a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
70b0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
70c0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
70d0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
70e0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
70f0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
7100: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
7110: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
7120: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
7130: 72 6e 61 6c 4f 66 66 2e 20 20 53 65 65 20 63 6f  rnalOff.  See co
7140: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
7150: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
7160: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
7170: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
7180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
7190: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
71a0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
71b0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
71c0: 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65  lly, *nRec is se
71d0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
71e0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
71f0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
7200: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62  s header and *db
7210: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
7220: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
7230: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
7240: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7250: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
7260: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
7270: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
7280: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
7290: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
72a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
72b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
72c0: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
72d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
72e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
72f0: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
7300: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
7310: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
7320: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
7330: 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a  *nRec and *dbSiz
7340: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
7350: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
7360: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
7370: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
7380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7390: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
73a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
73b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
73c0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
73d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
73e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
73f0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
7400: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
7410: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
7420: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7430: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7440: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7450: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7460: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
7470: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  32 iPageSize;.  
7480: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
7490: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
74a0: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
74b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
74c0: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
74e0: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
74f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
7500: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  ONE;.  }.  jrnlO
7510: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
7520: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d  rnalOff;..  rc =
7530: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
7540: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
7550: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
7560: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
7570: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7580: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7590: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b   sizeof(aMagic);
75a0: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
75b0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
75c0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
75d0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
75e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
75f0: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
7600: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7610: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
7620: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
7630: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7640: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7650: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
7660: 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65  rnlOff+4, &pPage
7670: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7680: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7690: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
76a0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
76b0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20  jfd, jrnlOff+8, 
76c0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
76d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
76e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
76f0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
7700: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
7710: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7720: 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 26 69 50   jrnlOff+16, &iP
7730: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
7740: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7750: 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
7760: 53 69 7a 65 3c 35 31 32 20 0a 20 20 20 20 20 7c  Size<512 .     |
7770: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
7780: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
7790: 20 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67   .     || ((iPag
77a0: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
77b0: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
77c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
77d0: 61 67 65 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  age-size in the 
77e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
77f0: 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  s invalid, then 
7800: 74 68 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  the process.    
7810: 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
7820: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
7830: 65 72 20 6d 75 73 74 20 68 61 76 65 20 63 72 61  er must have cra
7840: 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  shed before the 
7850: 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
7860: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
7870: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
7880: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7890: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
78a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
78b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
78c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
78d0: 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20 28 75  16 pagesize = (u
78e0: 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  16)iPageSize;.  
78f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7900: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
7910: 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69  (pPager, &pagesi
7920: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
7930: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
7940: 20 7c 7c 20 70 61 67 65 73 69 7a 65 3d 3d 28 75   || pagesize==(u
7950: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
7960: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7970: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7980: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
7990: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
79a0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
79b0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
79c0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
79d0: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
79e0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
79f0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
7a00: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
7a10: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7a20: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7a30: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7a40: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
7a50: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7a60: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7a70: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7a80: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
7a90: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
7aa0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
7ab0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
7ac0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
7ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
7ae0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7af0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7b00: 31 32 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  12, &iSectorSize
7b10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
7b20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
7b30: 66 28 20 28 69 53 65 63 74 6f 72 53 69 7a 65 26  f( (iSectorSize&
7b40: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 29  (iSectorSize-1))
7b50: 0a 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f  .      || iSecto
7b60: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 20  rSize<512.      
7b70: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
7b80: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
7b90: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
7ba0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7bb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7bc0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
7bd0: 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
7be0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7bf0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
7c00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
7c10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7c20: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  _OK;.}.../*.** W
7c30: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
7c40: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
7c50: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
7c60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
7c70: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
7c80: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
7c90: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
7ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7cb0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
7cc0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
7cd0: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
7ce0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
7cf0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
7d00: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
7d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
7d20: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
7d30: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
7d40: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7d50: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7d60: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7d70: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7d80: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7d90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7da0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7db0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7dc0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7dd0: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7de0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
7df0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
7e00: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
7e10: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
7e20: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
7e30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
7e40: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7e50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7e60: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7e70: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7e80: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7e90: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7ea0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7eb0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7ec0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7ed0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7ee0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7ef0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
7f00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
7f10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
7f20: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
7f30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7f40: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7f50: 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66  ; .  i64 jrnlOff
7f60: 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  ;.  i64 jrnlSize
7f70: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  ;.  u32 cksum = 
7f80: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73  0;.  char zBuf[s
7f90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7fa0: 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66  gic)+2*4];..  if
7fb0: 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50  ( !zMaster || pP
7fc0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
7fd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7fe0: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
7ff0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
8000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
8010: 5f 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e  _MEMORY ) return
8020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
8030: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8040: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  = 1;..  len = sq
8050: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
8060: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
8070: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
8080: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
8090: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
80a0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
80b0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
80c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
80d0: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
80e0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
80f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8100: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
8110: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
8120: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
8130: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
8140: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
8150: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
8160: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
8170: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
8180: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
8190: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72  Pager);.  }.  jr
81a0: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
81b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
81c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
81d0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
81e0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
81f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
8200: 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  rnlOff, PAGER_MJ
8210: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
8220: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8230: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8240: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b  .  jrnlOff += 4;
8250: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8260: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8270: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
8280: 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  n, jrnlOff);.  i
8290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
82b0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a  jrnlOff += len;.
82c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
82d0: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
82e0: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
82f0: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
8300: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
8310: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
8320: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
8330: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8340: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
8350: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
8360: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8370: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a  ), jrnlOff);.  j
8380: 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65  rnlOff += 8+size
8390: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
83a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
83b0: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
83c0: 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49  >noSync;..  /* I
83d0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
83e0: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
83f0: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
8400: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
8410: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
8420: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
8430: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
8440: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
8450: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
8460: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
8470: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
8480: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
8490: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
84a0: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
84b0: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
84c0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
84d0: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
84e0: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
84f0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
8500: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
8510: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
8520: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
8530: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
8540: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
8550: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
8560: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
8570: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
8580: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
8590: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
85a0: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
85b0: 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49  .  if( (rc==SQLI
85c0: 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63  TE_OK).   && (rc
85d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
85e0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
85f0: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53  , &jrnlSize))==S
8600: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a  QLITE_OK.   && j
8610: 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a  rnlSize>jrnlOff.
8620: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
8630: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8640: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
8650: 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
8660: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8670: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
8680: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
8690: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
86a0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
86b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
86c0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
86d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
86e0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
86f0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
8700: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
8710: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
8720: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
8730: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
8740: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
8750: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
8760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
8770: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
8780: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
8790: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
87a0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
87b0: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
87c0: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
87d0: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
87e0: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
87f0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
8800: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
8810: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
8820: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
8830: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
8840: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
8850: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
8860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8870: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
8880: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
8890: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
88a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
88b0: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
88c0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
88d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
88e0: 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
88f0: 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
8900: 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
8910: 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
8920: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
8930: 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
8940: 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
8950: 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
8960: 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
8970: 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
8980: 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
8990: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
89a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
89b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 50 61  eAllSavepoint(Pa
89c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
89d0: 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69  int ii;.  for(ii
89e0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
89f0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
8a00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
8a10: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
8a20: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
8a30: 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
8a40: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
8a50: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8a60: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
8a70: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
8a80: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
8a90: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
8aa0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
8ab0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8ac0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
8ad0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
8ae0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
8af0: 74 4e 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tNRec = 0;.}../*
8b00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
8b10: 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
8b20: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
8b30: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
8b40: 69 74 76 65 63 73 20 6f 66 0a 2a 2a 20 61 6c 6c  itvecs of.** all
8b50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
8b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8b70: 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
8b80: 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
8b90: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
8ba0: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bc0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8bd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8be0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
8bf0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
8c00: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
8c10: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
8c20: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
8c30: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
8c40: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
8c50: 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
8c60: 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
8c70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
8c80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
8c90: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
8ca0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  , pgno);.      a
8cb0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
8cc0: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
8cd0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
8ce0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
8d00: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
8d10: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
8d20: 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
8d30: 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20  rently in error 
8d40: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74  state, discard t
8d50: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a  he contents of .
8d60: 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ** the cache and
8d70: 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72   reset the Pager
8d80: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72   structure inter
8d90: 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68  nal state. If th
8da0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65  ere is.** an ope
8db0: 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20  n journal-file, 
8dc0: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69  then the next ti
8dd0: 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  me a shared-lock
8de0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
8df0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  on the pager fil
8e00: 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e  e (by this or an
8e10: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29  y other process)
8e20: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  , it will be.** 
8e30: 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74  treated as a hot
8e40: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
8e50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
8e60: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
8e70: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
8e80: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
8e90: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8ea0: 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
8eb0: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
8ec0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
8ed0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
8ee0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
8ef0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
8f00: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
8f10: 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
8f20: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
8f30: 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 41  ager))..    /* A
8f40: 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20  lways close the 
8f50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
8f60: 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
8f70: 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20  atabase lock..  
8f80: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
8f90: 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
8fa0: 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
8fb0: 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
8fc0: 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20  t.    ** delete 
8fd0: 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f  the file out fro
8fe0: 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
8ff0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
9000: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
9010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
9020: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
9030: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
9040: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
9050: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
9060: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
9070: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
9080: 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  l);.      pPager
9090: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
90a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
90b0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
90c0: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
90d0: 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 70 50 61  back);.      pPa
90e0: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
90f0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  back = 0;.    }.
9100: 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72  .    /* If Pager
9110: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
9120: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
9130: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9140: 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a   cannot be.    *
9150: 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74  * trusted. Now t
9160: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69  hat the pager fi
9170: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
9180: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
9190: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  the.    ** cache
91a0: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
91b0: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
91c0: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
91d0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
91e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
91f0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ode ){.      if(
9200: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9210: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9220: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9230: 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
9240: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
9250: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
9260: 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
9270: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9280: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
9290: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
92a0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
92b0: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
92c0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Size = 0;.    }.
92d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
92e0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
92f0: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
9300: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
9310: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
9320: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
9330: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
9340: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
9350: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
9360: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
9370: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
9380: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
9390: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
93a0: 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74  e, .** do not at
93b0: 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62 61  tempt the rollba
93c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
93d0: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
93e0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
93f0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72  *p){.  if( p->er
9400: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
9410: 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41   && p->state>=PA
9420: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
9430: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
9440: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
9450: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9460: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20  Rollback(p);.   
9470: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
9480: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
9490: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29   pager_unlock(p)
94a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
94b0: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
94c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74  ransaction.  A t
94d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
94e0: 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a  ded by either.**
94f0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
9500: 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57  OLLBACK..**.** W
9510: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
9520: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
9530: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
9540: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
9550: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
9560: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
9570: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9580: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
9590: 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a  ne will release.
95a0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
95b0: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
95c0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
95d0: 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20  in its place if 
95e0: 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61  that is.** the a
95f0: 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67  ppropriate thing
9600: 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65   to do.  Release
9610: 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69   locks usually i
9620: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a  s appropriate,.*
9630: 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20  * unless we are 
9640: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
9650: 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65  ess mode or unle
9660: 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a  ss this is a .**
9670: 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49   COMMIT AND BEGI
9680: 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e  N or ROLLBACK AN
9690: 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f  D BEGIN operatio
96a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  n..**.** The jou
96b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74  rnal file is eit
96c0: 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74  her deleted or t
96d0: 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  runcated..**.** 
96e0: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
96f0: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
9700: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
9710: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
9720: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
9730: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
9740: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
9750: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
9760: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
9770: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
9780: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
9790: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
97a0: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
97b0: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
97c0: 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
97d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
97e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
97f0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
9800: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9810: 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
9820: 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
9830: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9840: 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
9850: 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  epoint(pPager);.
9860: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
9870: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
9880: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
9890: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
98a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
98b0: 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY ){.      int 
98c0: 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20  isMemoryJournal 
98d0: 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  = sqlite3IsMemJo
98e0: 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
98f0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
9900: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
9910: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
9920: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
9930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
9940: 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c  !isMemoryJournal
9950: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9960: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9970: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
9980: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
9990: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
99a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
99b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
99c0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99d0: 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
99e0: 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
99f0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
9a00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d  Pager->jfd, 0))=
9a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9a20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9a30: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
9a40: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9a50: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
9a60: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
9a70: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9a80: 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  e .     || pPage
9a90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9aa0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9ab0: 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b  E_PERSIST.    ){
9ac0: 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
9ad0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
9ae0: 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
9af0: 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
9b00: 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
9b10: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9b20: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
9b30: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9b40: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
9b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9b60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
9b70: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9b80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
9b90: 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20  LETE || rc );.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9bb0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
9bc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9bd0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
9be0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9bf0: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
9c00: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
9c10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9c20: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
9c30: 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
9c40: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
9c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c60: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
9c70: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
9c80: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
9c90: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
9ca0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nal = 0;.    sql
9cb0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
9cc0: 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
9cd0: 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  sRollback);.    
9ce0: 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
9cf0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66  ollback = 0;.#if
9d00: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
9d10: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
9d20: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
9d30: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
9d40: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
9d50: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
9d60: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  f.    sqlite3Pca
9d70: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
9d80: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
9d90: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
9da0: 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  ache = 0;.    pP
9db0: 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
9dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
9dd0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
9de0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
9df0: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
9e00: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
9e10: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
9e20: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
9e30: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
9e40: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
9e50: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
9e60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
9e70: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
9e80: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
9e90: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9ea0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
9eb0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9ec0: 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a  dbOrigSize = 0;.
9ed0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
9ee0: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
9ef0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
9f00: 0a 20 20 2f 2a 20 6c 72 75 4c 69 73 74 53 65 74  .  /* lruListSet
9f10: 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
9f20: 65 72 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74 65  er); */.  sqlite
9f30: 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
9f40: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
9f50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
9f60: 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
9f70: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
9f80: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
9f90: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d   }.  pPager->dbM
9fa0: 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20  odified = 0;..  
9fb0: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
9fc0: 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
9fd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
9fe0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
9ff0: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
a000: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
a010: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
a020: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
a030: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
a040: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
a050: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
a060: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
a070: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
a080: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
a090: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
a0a0: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
a0b0: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
a0c0: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
a0d0: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
a0e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
a0f0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
a100: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
a110: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
a120: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
a130: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
a140: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
a150: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
a160: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
a170: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
a180: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
a190: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
a1a0: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
a1b0: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
a1c0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
a1d0: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
a1e0: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
a1f0: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
a200: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
a210: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
a220: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
a230: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
a240: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
a250: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
a260: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
a270: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
a280: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
a290: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
a2a0: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
a2b0: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
a2c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
a2d0: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
a2e0: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
a2f0: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
a300: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
a310: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
a320: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
a330: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
a340: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
a350: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
a360: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
a370: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
a380: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
a390: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
a3a0: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
a3b0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
a3c0: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
a3d0: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
a3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
a3f0: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
a400: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
a410: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
a420: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
a430: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
a440: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
a450: 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77  ageSize-200;.  w
a460: 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
a470: 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
a480: 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
a490: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
a4a0: 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
a4b0: 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
a4c0: 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  e from either th
a4d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
a4e0: 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31  if isMainJrnl==1
a4f0: 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ) or.** from the
a500: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66   sub-journal (if
a510: 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20   isMainJrnl==0) 
a520: 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61  and playback tha
a530: 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70  t page..** The p
a540: 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66  age begins at of
a550: 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e  fset *pOffset in
a560: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
a570: 65 20 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  e  *pOffset.** v
a580: 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
a590: 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
a5a0: 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
a5b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
a5c0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e  **.** The isMain
a5d0: 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75  Jrnl flag is tru
a5e0: 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
a5f0: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
a600: 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61  ournal and.** fa
a610: 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74  lse for the stat
a620: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
a630: 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
a640: 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a  k journal uses.*
a650: 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  * checksums - th
a660: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
a670: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a  nal does not..**
a680: 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
a690: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
a6a0: 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
a6b0: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
a6c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
a6d0: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
a6e0: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
a6f0: 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
a700: 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
a710: 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
a720: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
a730: 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
a740: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
a750: 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
a760: 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
a770: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
a780: 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
a790: 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
a7a0: 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
a7b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
a7c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
a7d0: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
a7e0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
a7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a800: 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
a810: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
a820: 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
a830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
a840: 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
a850: 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
a860: 61 6c 2e 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  al. */.  i64 *pO
a870: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
a880: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
a890: 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
a8a0: 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  ayback */.  int 
a8b0: 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20  isSavepnt,      
a8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a8d0: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
a8e0: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t rollback */.  
a8f0: 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20  Bitvec *pDone   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a910: 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
a920: 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
a930: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
a940: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
a950: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
a960: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
a970: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
a980: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
a990: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
a9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a9b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
a9c0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
a9d0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
aa00: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
aa10: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
aa20: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aa40: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
aa50: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
aa60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
aa70: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
aa80: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
aa90: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
aaa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
aab0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
aac0: 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
aad0: 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
aae0: 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
aaf0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
ab00: 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
ab10: 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
ab20: 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
ab30: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
ab40: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
ab50: 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
ab60: 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
ab70: 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
ab80: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
ab90: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
aba0: 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
abb0: 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
abc0: 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
abd0: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
abe0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
abf0: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
ac00: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
ac10: 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
ac20: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
ac30: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 6a  llocated */..  j
ac40: 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
ac50: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
ac60: 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 0a 20  pPager->sjfd;.. 
ac70: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
ac80: 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
ac90: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
aca0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
acb0: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
acc0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
acd0: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
ace0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
acf0: 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
ad00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ad10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
ad20: 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
ad30: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
ad40: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
ad50: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
ad60: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
ad70: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
ad80: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
ad90: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
ada0: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
adb0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
adc0: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
add0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
ade0: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
adf0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
ae00: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
ae10: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
ae20: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
ae30: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
ae40: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
ae50: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
ae60: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
ae70: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
ae80: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
ae90: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
aea0: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
aeb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aec0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
aed0: 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
aee0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73  ger->dbSize || s
aef0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
af00: 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b  (pDone, pgno) ){
af10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
af20: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
af30: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
af40: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
af50: 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65  ts(jfd, (*pOffse
af60: 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  t)-4, &cksum);. 
af70: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
af80: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21  rn rc;.    if( !
af90: 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67  isSavepnt && pag
afa0: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
afb0: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
afc0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
afd0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
afe0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 6f 6e  }.  }.  if( pDon
aff0: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
b000: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
b010: 65 2c 20 70 67 6e 6f 29 29 20 29 7b 0a 20 20 20  e, pgno)) ){.   
b020: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
b030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b040: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
b050: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
b060: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
b070: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
b080: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
b090: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
b0a0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
b0b0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
b0c0: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
b0d0: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
b0e0: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
b0f0: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
b100: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
b110: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
b120: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
b130: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
b140: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
b150: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
b160: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
b170: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
b180: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
b190: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
b1a0: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
b1b0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
b1c0: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
b1d0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
b1e0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
b1f0: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
b200: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
b210: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
b220: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
b230: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
b240: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
b250: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
b260: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
b270: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
b280: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
b290: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
b2a0: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
b2b0: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
b2c0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
b2d0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
b2e0: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
b2f0: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
b300: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
b310: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
b320: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
b330: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
b340: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
b350: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
b360: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
b370: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
b380: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
b390: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
b3a0: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
b3b0: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
b3c0: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
b3d0: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
b3e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
b3f0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
b400: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
b410: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
b420: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
b430: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
b440: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
b450: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
b460: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
b470: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
b480: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
b490: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
b4a0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
b4b0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
b4c0: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
b4d0: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
b4e0: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
b4f0: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
b500: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
b510: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
b520: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
b530: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
b540: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
b550: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
b560: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
b570: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
b580: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
b590: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
b5a0: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
b5b0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
b5c0: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
b5d0: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
b5e0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
b5f0: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
b600: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
b610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
b620: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
b630: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
b640: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
b650: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
b660: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
b670: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
b680: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
b690: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
b6a0: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
b6b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
b6c0: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
b6d0: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
b6e0: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
b6f0: 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
b700: 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
b710: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
b720: 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
b730: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
b740: 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
b750: 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
b760: 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
b770: 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
b780: 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
b790: 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
b7a0: 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
b7b0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
b7c0: 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
b7d0: 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  d..  */.  pPg = 
b7e0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
b7f0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41  ger, pgno);.  PA
b800: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
b810: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
b820: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
b830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b840: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
b850: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
b860: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
b870: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a  geSize, aData),.
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b890: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
b8a0: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
b8b0: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
b8c0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
b8d0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
b8e0: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
b8f0: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
b900: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
b910: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 28 70  _SYNC)).   && (p
b920: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
b930: 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  ods).  ){.    i6
b940: 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
b950: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
b960: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
b970: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
b980: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
b990: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
b9a0: 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
b9b0: 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
b9c0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
b9d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
b9e0: 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
b9f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ba00: 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
ba10: 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
ba20: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
ba30: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
ba40: 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
ba50: 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
ba60: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
ba70: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
ba80: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
ba90: 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
baa0: 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
bab0: 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
bac0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
bad0: 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
bae0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
baf0: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
bb00: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
bb10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
bb20: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
bb30: 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
bb40: 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
bb50: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
bb60: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
bb70: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
bb80: 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
bb90: 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
bba0: 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
bbb0: 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
bbc0: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
bbd0: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
bbe0: 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
bbf0: 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
bc00: 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
bc10: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
bc20: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
bc30: 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
bc40: 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
bc50: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
bc60: 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
bc70: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
bc80: 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
bc90: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
bca0: 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
bcb0: 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
bcc0: 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
bcd0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
bce0: 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
bcf0: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
bd00: 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
bd10: 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
bd20: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
bd30: 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
bd40: 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
bd50: 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
bd60: 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
bd70: 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
bd80: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
bd90: 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
bda0: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
bdb0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
bdc0: 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
bdd0: 26 70 50 67 2c 20 31 29 29 20 29 7b 0a 20 20 20  &pPg, 1)) ){.   
bde0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
bdf0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61    }.    pPg->fla
be00: 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
be10: 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
be20: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
be30: 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
be40: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
be50: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
be60: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
be70: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
be80: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
be90: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
bea0: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
beb0: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
bec0: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
bed0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
bee0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
bef0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
bf00: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
bf10: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
bf20: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
bf30: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
bf40: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
bf50: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
bf60: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
bf70: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
bf80: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
bf90: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
bfa0: 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
bfb0: 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
bfc0: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
bfd0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
bfe0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bff0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
c000: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
c010: 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
c020: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69   }.    if( isMai
c030: 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
c040: 65 70 6e 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e  epnt || pPager->
c050: 6a 6f 75 72 6e 61 6c 4f 66 66 3c 3d 70 50 61 67  journalOff<=pPag
c060: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
c070: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
c080: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
c090: 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
c0a0: 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
c0b0: 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
c0c0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
c0d0: 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
c0e0: 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
c0f0: 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
c100: 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
c110: 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
c120: 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
c130: 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
c140: 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
c150: 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
c160: 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
c170: 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
c180: 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
c190: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c1a0: 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   ** There is one
c1b0: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
c1c0: 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20  is rule. If the 
c1d0: 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f  page is being ro
c1e0: 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  lled.      ** ba
c1f0: 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ck as part of a 
c200: 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74  savepoint (or st
c210: 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63  atement) rollbac
c220: 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20  k from an .     
c230: 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   ** unsynced por
c240: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e  tion of the main
c250: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
c260: 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hen it is not sa
c270: 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  fe.      ** to m
c280: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
c290: 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62  clean. This is b
c2a0: 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74  ecause marking t
c2b0: 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20  he page as.     
c2c0: 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63   ** clean will c
c2d0: 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
c2e0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53  EED_SYNC flag. S
c2f0: 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73  ince the page is
c300: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
c310: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
c320: 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20   file (recorded 
c330: 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
c340: 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  nal) and.      *
c350: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
c360: 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c  _SYNC flag is cl
c370: 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61  eared, if the pa
c380: 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ge is written to
c390: 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
c3a0: 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
c3b0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  saction, it will
c3c0: 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
c3d0: 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  rty but.      **
c3e0: 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
c3f0: 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e  SYNC flag will n
c400: 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f  ot be set. It co
c410: 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69  uld then potenti
c420: 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65  ally.      ** be
c430: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74   written out int
c440: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
c450: 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a  ile before its j
c460: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
c470: 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20    ** segment is 
c480: 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61  synced. If a cra
c490: 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  sh occurs during
c4a0: 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   or following th
c4b0: 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  is,.      ** dat
c4c0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
c4d0: 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20   may ensue..    
c4e0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
c4f0: 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
c500: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69  n(pPg);.    }.#i
c510: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
c520: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
c530: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
c540: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
c550: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49  .#endif.    /* I
c560: 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
c570: 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
c580: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
c590: 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
c5a0: 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
c5b0: 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
c5c0: 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
c5d0: 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
c5e0: 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
c5f0: 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
c600: 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
c610: 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
c620: 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
c630: 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
c640: 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
c650: 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
c660: 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
c670: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
c680: 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69  no, 3);.    sqli
c690: 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
c6a0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
c6b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
c6c0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
c6d0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
c6e0: 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
c6f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c700: 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61 64 20  ine looks ahead 
c710: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
c720: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 64  urnal file and d
c730: 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 65  etermines.** whe
c740: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
c750: 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74 68 65  next record (the
c760: 20 72 65 63 6f 72 64 20 74 68 61 74 20 62 65 67   record that beg
c770: 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a 20 6f  ins at file.** o
c780: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 6a 6f  ffset pPager->jo
c790: 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61 20 77  urnalOff) is a w
c7a0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67 65 20  ell-formed page 
c7b0: 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 69 6e  record consistin
c7c0: 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69 64 20  g.** of a valid 
c7d0: 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70 50 61  page number, pPa
c7e0: 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  ge->pageSize byt
c7f0: 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c 20 66  es of content, f
c800: 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 61 20  ollowed.** by a 
c810: 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d 2e 0a  valid checksum..
c820: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
c830: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 6b  never needs to k
c840: 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72 64 65  now this in orde
c850: 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62 2e  r to do its job.
c860: 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69     This.** routi
c870: 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ne is only used 
c880: 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65 72 74  from with assert
c890: 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
c8a0: 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73 74 61  ) macros..*/.sta
c8b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e 65 78  tic int pagerNex
c8c0: 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
c8d0: 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  lid(Pager *pPage
c8e0: 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
c8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c900: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
c910: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
c920: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
c930: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
c940: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
c950: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
c960: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c970: 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70 65 72  e from read oper
c980: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
c990: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
c9a0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
c9b0: 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77 68 69  criptor from whi
c9c0: 63 68 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ch we are readin
c9d0: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
c9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
c9f0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
ca00: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ge */..  /* Read
ca10: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
ca20: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66 64 20   header */.  fd 
ca30: 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a 20  = pPager->jfd;. 
ca40: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
ca50: 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  (fd, pPager->jou
ca60: 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f 29 3b  rnalOff, &pgno);
ca70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ca80: 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30  E_OK ){ return 0
ca90: 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
cac0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
cad0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
cae0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
caf0: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
cb00: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
cb10: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
cb20: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
cb30: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
cb60: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
cb70: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63  checksum */.  rc
cb80: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 64   = read32bits(fd
cb90: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
cba0: 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  lOff+pPager->pag
cbb0: 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29  eSize+4, &cksum)
cbc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
cbd0: 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
cbe0: 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
cc10: 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
cc20: 20 64 61 74 61 20 61 6e 64 20 76 65 72 69 66 79   data and verify
cc30: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f   the checksum */
cc40: 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29  .  aData = (u8*)
cc50: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
cc60: 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
cc70: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44 61 74  3OsRead(fd, aDat
cc80: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
cc90: 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ize, pPager->jou
cca0: 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20 69 66  rnalOff+4);.  if
ccb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ccc0: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
cd00: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
cd10: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
cd20: 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  sum ){ return 0;
cd30: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
cd40: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
cd50: 2a 20 52 65 61 63 68 20 74 68 69 73 20 70 6f 69  * Reach this poi
cd60: 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 70  nt only if the p
cd70: 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  age is valid */.
cd80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
cd90: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
cda0: 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
cdb0: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
cdc0: 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 2f 2a  AGE_TEST) */../*
cdd0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
cde0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
cdf0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
ce00: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
ce10: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
ce20: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
ce30: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
ce40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
ce50: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
ce60: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
ce70: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
ce80: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
ce90: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
cea0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ceb0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
cec0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
ced0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
cee0: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
cef0: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
cf00: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
cf10: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
cf20: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
cf30: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
cf40: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
cf50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cf60: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
cf70: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
cf80: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
cf90: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
cfa0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
cfb0: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
cfc0: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
cfd0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
cfe0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
cff0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
d000: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
d010: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
d020: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
d030: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
d040: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d050: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
d060: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
d070: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
d080: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
d090: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
d0a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
d0b0: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
d0c0: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
d0d0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
d0e0: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
d0f0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
d100: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d110: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
d120: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
d130: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
d140: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
d150: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
d160: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
d170: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
d180: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
d190: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
d1a0: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
d1b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
d1c0: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
d1d0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
d1e0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
d1f0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
d200: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
d210: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
d220: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
d230: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
d240: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
d250: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 56  sqlite3Malloc(pV
d260: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
d270: 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
d280: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
d290: 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
d2a0: 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
d2b0: 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
d2c0: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
d2d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
d2e0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c  else{.    int fl
d2f0: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
d300: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
d310: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
d320: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
d330: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
d340: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
d350: 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
d360: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
d370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d380: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
d390: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
d3a0: 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   1;..  rc = sqli
d3b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
d3c0: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
d3d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
d3e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
d3f0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
d400: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
d410: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
d420: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
d430: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
d440: 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
d450: 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
d460: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
d470: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
d480: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
d490: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
d4a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
d4b0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
d4c0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
d4d0: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
d4e0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
d4f0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
d500: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
d510: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
d520: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28  )sqlite3Malloc((
d530: 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
d540: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
d550: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
d560: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
d570: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
d580: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
d590: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
d5a0: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
d5b0: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
d5c0: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
d5d0: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
d5e0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d5f0: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
d600: 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
d610: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
d620: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d630: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
d640: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
d650: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
d660: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
d670: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
d680: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
d690: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
d6a0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
d6b0: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
d6c0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
d6d0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
d6e0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
d6f0: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
d700: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d720: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
d730: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
d740: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
d750: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
d760: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
d770: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
d780: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d790: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
d7a0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
d7b0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
d7c0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
d7d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
d7e0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
d7f0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
d800: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
d810: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
d820: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d830: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
d840: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
d850: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
d860: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
d870: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
d880: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d890: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
d8a0: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
d8b0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
d8c0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
d8d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d8e0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
d8f0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
d900: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
d910: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
d920: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
d930: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
d940: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
d950: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
d960: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
d970: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d980: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
d990: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
d9a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
d9b0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
d9c0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
d9d0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
d9e0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
d9f0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
da00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
da10: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
da20: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
da30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
da40: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
da50: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
da60: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
da70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
da80: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
da90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
daa0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
dab0: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
dac0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
dad0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
dae0: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
daf0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
db00: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
db10: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
db20: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
db30: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
db40: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
db50: 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
db60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
db70: 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
db80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
db90: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  /*.** If the mai
dba0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
dbb0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 6e 20 65  is open and an e
dbc0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
dbd0: 20 68 65 6c 64 2c 20 0a 2a 2a 20 74 72 75 6e 63   held, .** trunc
dbe0: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
dbf0: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
dc00: 61 67 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  ager to the spec
dc10: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 0a 2a 2a  ified number .**
dc20: 20 6f 66 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a   of pages..**.**
dc30: 20 49 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   It might might 
dc40: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
dc50: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
dc60: 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
dc70: 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73  n nPage..** This
dc80: 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
dc90: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20   example, if we 
dca0: 61 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  are in the middl
dcb0: 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  e of a transacti
dcc0: 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20  on.** which has 
dcd0: 65 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c  extended the fil
dce0: 65 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  e size and the n
dcf0: 65 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69  ew pages are sti
dd00: 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69  ll all held.** i
dd10: 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e  n cache, then an
dd20: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
dd30: 45 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65  E does a stateme
dd40: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f  nt rollback.  So
dd50: 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  me.** operating 
dd60: 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
dd70: 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
dd80: 6f 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74  onfused if you t
dd90: 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74  ry to.** truncat
dda0: 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
ddb0: 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
ddc0: 72 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72  rger than it cur
ddd0: 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f  rently is,.** so
dde0: 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
ddf0: 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
de00: 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
de10: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
de20: 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73   new.** file ins
de30: 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tead..*/.static 
de40: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
de50: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
de60: 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
de70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
de80: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
de90: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
dea0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61  EXCLUSIVE && pPa
deb0: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
dec0: 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72  s ){.    i64 cur
ded0: 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
dee0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
def0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
df00: 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
df10: 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
df20: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
df30: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
df40: 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
df50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
df60: 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
df70: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
df80: 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
df90: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
dfa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
dfb0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
dfc0: 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
dfd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
dff0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
e000: 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
e010: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e020: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e030: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
e040: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
e050: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
e060: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e070: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e080: 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Set the sector
e090: 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76  Size for the giv
e0a0: 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  en pager..**.** 
e0b0: 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
e0c0: 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62  is at least as b
e0d0: 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72  ig as the sector
e0e0: 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a   size reported.*
e0f0: 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  * by sqlite3OsSe
e100: 63 74 6f 72 53 69 7a 65 28 29 2e 20 54 68 65 20  ctorSize(). The 
e110: 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73  minimum sector s
e120: 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73  ize is 512..*/.s
e130: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
e140: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
e150: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
e160: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
e170: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
e180: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
e190: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
e1a0: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
e1b0: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
e1c0: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
e1d0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
e1e0: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
e1f0: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
e200: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
e210: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
e220: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
e230: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
e240: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
e250: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
e260: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
e270: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
e280: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
e290: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
e2a0: 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29  sectorSize<512 )
e2b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
e2c0: 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
e2d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
e2e0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58  ->sectorSize>MAX
e2f0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
e300: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
e310: 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43  orSize = MAX_SEC
e320: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a  TOR_SIZE;.  }.}.
e330: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
e340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
e350: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
e360: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
e370: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
e380: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
e390: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
e3a0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
e3b0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e3c0: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
e3d0: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
e3e0: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
e3f0: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
e400: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
e410: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
e420: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
e430: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
e440: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
e450: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
e460: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
e470: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
e480: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
e490: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
e4a0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
e4b0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
e4c0: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
e4d0: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
e4e0: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
e4f0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
e500: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
e510: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
e520: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
e530: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
e540: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
e550: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
e560: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
e570: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
e580: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
e590: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
e5a0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
e5b0: 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
e5c0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
e5d0: 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
e5e0: 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
e5f0: 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
e600: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
e610: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
e620: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
e630: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
e640: 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 63  ch is the page c
e650: 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20  ase..**  (7)  4 
e660: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
e670: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
e680: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
e690: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
e6a0: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
e6b0: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
e6c0: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
e6d0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
e6e0: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
e6f0: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
e700: 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  8)  N bytes of t
e710: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e720: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
e730: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
e740: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
e750: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
e760: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
e770: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
e780: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
e790: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
e7a0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
e7b0: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
e7c0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
e7d0: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
e7e0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
e7f0: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
e800: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
e810: 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (9)  Zero or mor
e820: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
e830: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
e840: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
e850: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
e860: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
e870: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
e880: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
e890: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
e8a0: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
e8b0: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
e8c0: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
e8d0: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
e8e0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69 74  n the first 8 it
e8f0: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
e900: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
e910: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
e920: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74  stance of the 9t
e930: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
e940: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
e950: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
e960: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
e970: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
e980: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
e990: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
e9a0: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
e9b0: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
e9c0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
e9d0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
e9e0: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
e9f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
ea00: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
ea10: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
ea20: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
ea30: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
ea40: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
ea50: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
ea60: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
ea70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ea80: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
ea90: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
eaa0: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
eab0: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
eac0: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
ead0: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
eae0: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
eaf0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
eb00: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
eb10: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
eb20: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
eb30: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
eb40: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
eb50: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
eb60: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
eb70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
eb80: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
eb90: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
eba0: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
ebb0: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
ebc0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
ebd0: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
ebe0: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
ebf0: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
ec00: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
ec10: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
ec20: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
ec30: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
ec40: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
ec50: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
ec60: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
ec70: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
ec80: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
ec90: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
eca0: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
ecb0: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
ecc0: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
ecd0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
ece0: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
ecf0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
ed00: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
ed10: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
ed20: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
ed30: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
ed40: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
ed50: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
ed60: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
ed70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ed80: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
ed90: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
eda0: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
edb0: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
edc0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
edd0: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
ede0: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
edf0: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
ee00: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
ee10: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
ee20: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
ee30: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
ee40: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
ee50: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
ee60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
ee70: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ee80: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
ee90: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
eea0: 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
eeb0: 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
eec0: 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
eed0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
eee0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
eef0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ef00: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
ef10: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
ef20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ef30: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
ef40: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
ef50: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
ef60: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
ef70: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
ef80: 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
ef90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
efa0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
efb0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
efc0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
efd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
efe0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
eff0: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
f000: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
f010: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
f020: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
f030: 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
f040: 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
f050: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
f060: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
f070: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f080: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
f090: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
f0a0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
f0b0: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
f0c0: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
f0d0: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
f0e0: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
f0f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f100: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
f110: 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
f120: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
f130: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
f140: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f150: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
f160: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
f170: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
f180: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
f190: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
f1a0: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
f1b0: 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
f1c0: 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
f1d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f1e0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
f1f0: 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
f200: 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
f210: 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
f220: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
f230: 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
f240: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
f250: 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
f260: 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d   back..  */.  zM
f270: 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
f280: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
f290: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
f2a0: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
f2b0: 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
f2c0: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
f2d0: 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
f2e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
f2f0: 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
f300: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
f310: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
f320: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
f330: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
f340: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
f350: 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
f360: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
f370: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
f380: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
f390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f3a0: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
f3b0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
f3c0: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
f3d0: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
f3e0: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
f3f0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
f400: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
f410: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
f420: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
f430: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
f440: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f450: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f460: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
f470: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
f480: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
f490: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
f4a0: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
f4b0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
f4c0: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
f4d0: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
f4e0: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
f4f0: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
f500: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
f510: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
f520: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
f530: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
f540: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
f550: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
f560: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
f570: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
f580: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f590: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
f5a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
f5b0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
f5c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f5d0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
f5e0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
f5f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
f600: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
f610: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
f620: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
f630: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
f640: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
f650: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
f660: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
f670: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
f680: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
f690: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
f6a0: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
f6b0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
f6c0: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
f6d0: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
f6e0: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
f6f0: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
f700: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
f710: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
f720: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
f730: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f740: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
f750: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
f760: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
f770: 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
f780: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f790: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
f7a0: 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
f7b0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
f7c0: 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
f7d0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
f7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
f7f0: 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
f800: 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
f810: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
f820: 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
f830: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
f840: 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
f850: 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
f860: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
f870: 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
f880: 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
f890: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
f8a0: 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
f8b0: 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
f8c0: 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
f8d0: 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
f8e0: 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
f8f0: 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
f900: 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
f910: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
f920: 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
f930: 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
f940: 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
f950: 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
f960: 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
f970: 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
f980: 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
f990: 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
f9a0: 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
f9b0: 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
f9c0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
f9d0: 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
f9e0: 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
f9f0: 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
fa00: 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
fa10: 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
fa20: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
fa30: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
fa40: 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
fa50: 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
fa60: 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
fa70: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
fa80: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
fa90: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
faa0: 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
fab0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
fac0: 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
fad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
fae0: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74  ze..    */.    t
faf0: 65 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30  estcase( nRec==0
fb00: 20 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20   && !isHot.     
fb10: 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
fb20: 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
fb30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
fb40: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
fb50: 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26  lOff.         &&
fb60: 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d   ((szJ - pPager-
fb70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
fb80: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
fb90: 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20  ger))>0.        
fba0: 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75   && pagerNextJou
fbb0: 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
fbc0: 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
fbd0: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
fbe0: 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
fbf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
fc00: 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
fc10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
fc20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fc30: 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
fc40: 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
fc50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fc60: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
fc70: 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
fc80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
fc90: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
fca0: 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
fcb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
fcc0: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
fcd0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
fce0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
fcf0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
fd00: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
fd10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
fd20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
fd30: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
fd40: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
fd50: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
fd60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fd70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd80: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
fd90: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
fda0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
fdb0: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
fdc0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
fdd0: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
fde0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
fdf0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
fe00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
fe10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
fe20: 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
fe30: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
fe40: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
fe50: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
fe60: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
fe70: 61 6c 4f 66 66 2c 20 30 2c 20 30 29 3b 0a 20 20  alOff, 0, 0);.  
fe80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
fe90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
fea0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
feb0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
fec0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
fed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
fee0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
fef0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
ff00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ff10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ff20: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
ff30: 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
ff40: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
ff50: 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20  se is probably. 
ff60: 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e           ** goin
ff70: 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69 6e  g to end up bein
ff80: 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20 69  g corrupt.  It i
ff90: 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73 2c  s corrupt to us,
ffa0: 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20 20   anyhow..       
ffb0: 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68     ** Perhaps th
ffc0: 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20 74  e next process t
ffd0: 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e  o come along can
ffe0: 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20   fix it.....    
fff0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10000 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10010 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
10020 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10030 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
10040 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10050 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
10060 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
10070 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
10080 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
10090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
100a0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
100b0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
100c0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
100d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
100e0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
100f0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
10100 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20  thname+1);.  }. 
10110 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10120 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
10130 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
10140 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
10150 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
10160 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
10170 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
10180 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
10190 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
101a0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
101b0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
101c0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
101d0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
101e0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
101f0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
10200 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10210 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
10220 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
10230 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
10240 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
10250 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
10260 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
10270 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
10280 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
10290 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
102a0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
102b0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
102c0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
102d0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
102e0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
102f0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
10300 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
10310 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
10320 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
10330 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
10350 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
10360 76 65 70 6f 69 6e 74 2e 20 20 4f 72 2c 20 69 66  vepoint.  Or, if
10370 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
10380 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
10390 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
103a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
103b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  le..**.** The ca
103c0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
103d0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
103e0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
103f0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
10400 0a 2a 2a 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  .** on a SAVEPOI
10410 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
10420 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
10430 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
10440 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
10450 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
10460 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
10470 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
10480 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
104b0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
104c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
104d0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
104e0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
104f0 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
10500 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
10510 72 64 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 69  rds */.  Pgno ii
10520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10530 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
10540 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
10550 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
10560 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10570 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
10580 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
10590 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
105a0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
105b0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
105c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
105d0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
105e0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
105f0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
10600 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
10610 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
10620 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
10630 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
10640 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
10650 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
10660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10680 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 75   }.  }..  /* Tru
10690 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
106a0 73 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  se back to the s
106b0 69 7a 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  ize it was befor
106c0 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 61 76 65  e the .  ** save
106d0 70 6f 69 6e 74 20 62 65 69 6e 67 20 72 65 76 65  point being reve
106e0 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
106f0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
10700 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
10710 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
10720 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
10730 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
10740 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10750 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
10760 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 65  RED );..  /* Use
10770 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10780 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
10790 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
107a0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
107b0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
107c0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
107d0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
107e0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
107f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10800 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
10810 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10820 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
10830 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
10840 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10850 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
10860 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
10870 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
10880 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10890 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
108a0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
108b0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
108c0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
108d0 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
108e0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
108f0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
10900 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
10910 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
10920 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
10930 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
10940 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
10950 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
10960 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
10970 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
10980 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
10990 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
109a0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
109b0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
109c0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
109d0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
109e0 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
109f0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
10a00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
10a10 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
10a20 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
10a30 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
10a40 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
10a50 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
10a60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10a70 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
10a80 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
10a90 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10aa0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
10ab0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
10ac0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
10ad0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
10ae0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
10af0 72 2c 20 31 2c 20 26 70 50 61 67 65 72 2d 3e 6a  r, 1, &pPager->j
10b00 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
10b10 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  one);.      asse
10b20 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
10b30 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ONE );.    }.  }
10b40 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
10b50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
10b60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
10b70 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
10b80 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
10b90 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
10ba0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
10bb0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
10bc0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
10bd0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
10be0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
10bf0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
10c00 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
10c10 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
10c20 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
10c30 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
10c40 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
10c50 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
10c60 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
10c70 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
10c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10ca0 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
10cb0 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
10cc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
10cd0 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
10ce0 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
10cf0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
10d00 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
10d10 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
10d20 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
10d30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
10d40 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
10d50 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
10d60 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
10d70 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10d80 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
10d90 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
10da0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
10db0 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
10dc0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
10dd0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
10de0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
10df0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
10e00 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
10e10 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
10e20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52     assert( !(nJR
10e30 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ec==0.         &
10e40 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
10e50 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
10e60 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61  _SZ(pPager)!=pPa
10e70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10e80 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a           && ((sz
10e90 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
10ea0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
10eb0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
10ec0 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  >0.         && p
10ed0 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
10ee0 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65  ageIsValid(pPage
10ef0 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  r)).    );.    i
10f00 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
10f10 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
10f20 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
10f30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
10f40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f50 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
10f60 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
10f70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10f80 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
10f90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
10fa0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
10fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
10fc0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
10fd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
10fe0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
10ff0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
11000 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
11010 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 72 2d  ger, 1, &pPager-
11020 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
11030 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73  pDone);.      as
11040 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11050 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20  _DONE );.    }. 
11060 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
11070 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
11080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11090 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  ==szJ );..  /* F
110a0 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
110b0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
110c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
110d0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
110e0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
110f0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
11100 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
11110 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
11120 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
11130 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
11140 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
11150 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
11160 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
11170 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
11180 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
11190 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75   pSavepoint->iSu
111a0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
111b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66  pageSize);.    f
111c0 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
111d0 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
111e0 51 4c 49 54 45 5f 4f 4b 26 26 69 69 3c 28 75 33  QLITE_OK&&ii<(u3
111f0 32 29 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  2)pPager->stmtNR
11200 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
11210 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
11220 3d 3d 20 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  == ii*(4+pPager-
11230 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
11240 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11250 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11260 28 70 50 61 67 65 72 2c 20 30 2c 20 26 6f 66 66  (pPager, 0, &off
11270 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
11280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11290 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
112a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
112b0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
112c0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
112d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
112e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
112f0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
11300 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11320 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
11330 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
11340 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
11350 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
11360 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11370 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
11380 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
11390 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
113a0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
113b0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
113c0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
113d0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
113e0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
113f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
11400 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
11410 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
11420 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
11430 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
11440 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
11450 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
11460 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11470 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
11480 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
11490 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
114a0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
114b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
114c0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
114d0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
114e0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
114f0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
11500 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
11510 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
11520 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11530 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
11540 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
11550 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11560 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
11570 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
11580 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
11590 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
115a0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
115b0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
115c0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
115d0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
115e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
115f0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
11600 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
11610 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
11620 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
11630 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
11640 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
11650 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
11660 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
11670 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
11680 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11690 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
116a0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
116b0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
116c0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
116d0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
116e0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
116f0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
11700 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11710 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
11720 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
11730 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
11740 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
11750 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
11760 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
11770 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11780 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
11790 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
117a0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
117b0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
117c0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
117d0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
117e0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
117f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
11800 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
11810 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
11820 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
11830 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11840 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
11850 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
11860 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
11870 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
11880 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
11890 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
118a0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
118b0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
118c0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
118d0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
118e0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
118f0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
11900 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
11910 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
11920 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
11930 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
11940 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
11950 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
11960 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
11970 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
11980 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
11990 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
119a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
119b0 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
119c0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
119d0 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
119e0 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
119f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
11a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
11a10 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
11a20 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
11a30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
11a40 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
11a50 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
11a60 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
11a70 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
11a80 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
11a90 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
11aa0 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
11ab0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
11ac0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
11ad0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
11ae0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
11af0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
11b00 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
11b10 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
11b20 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
11b30 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
11b40 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
11b50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
11b60 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
11b70 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
11b80 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
11b90 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
11ba0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
11bb0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
11bc0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
11bd0 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  he temporary.** 
11be0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
11bf0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
11c00 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  c int sqlite3Pag
11c10 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
11c20 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
11c30 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
11c40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
11c50 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
11c60 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
11c70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11c80 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
11c90 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
11ca0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
11cb0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
11cc0 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
11cd0 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
11ce0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
11cf0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
11d00 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
11d10 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
11d20 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
11d30 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
11d40 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
11d50 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
11d60 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
11d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
11d80 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
11d90 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
11da0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
11db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11dc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
11dd0 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
11de0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
11df0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11e00 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65  OK || pFile->pMe
11e10 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75 72  thods );.  retur
11e20 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
11e30 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
11e40 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a 29 3b  void *,PgHdr *);
11e50 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
11e60 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
11e70 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
11e80 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
11e90 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
11ea0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
11eb0 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
11ec0 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
11ed0 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
11ee0 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
11ef0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
11f00 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
11f10 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
11f20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
11f30 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
11f40 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
11f50 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
11f60 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
11f70 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
11f80 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
11f90 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
11fa0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
11fb0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
11fc0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
11fd0 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
11fe0 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
11ff0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
12000 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
12010 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
12020 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
12030 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
12040 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
12050 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
12060 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
12070 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
12080 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
12090 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
120a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
120b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
120c0 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
120d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
120e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
120f0 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
12100 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
12110 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
12120 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12130 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
12140 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
12150 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12160 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
12170 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12180 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
12190 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
121a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
121b0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
121c0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
121d0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
121e0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
121f0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
12200 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
12210 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
12220 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
12230 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
12240 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
12250 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
12260 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  ) */.){.  u8 *pP
12270 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
12280 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ger = 0;.  int r
12290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
122a0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65   int i;.  int te
122b0 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  mpFile = 0;.  in
122c0 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
122d0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
122e0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
122f0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
12300 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
12310 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61  ==0;.  int noRea
12320 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
12330 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
12340 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f  CK)!=0;.  int jo
12350 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 0a 20  urnalFileSize;. 
12360 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
12370 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
12380 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73 7a 50  ize();.  int szP
12390 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
123a0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
123b0 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74  ZE;.  char *zPat
123c0 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
123d0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a   nPathname = 0;.
123e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
123f0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
12400 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
12410 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
12420 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
12430 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
12440 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d 65 6c  ize(pVfs);.  }el
12450 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
12460 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
12470 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
12480 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
12490 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20   default return 
124a0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
124b0 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  r */.  *ppPager 
124c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
124d0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
124e0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
124f0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
12500 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
12510 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
12520 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
12530 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
12540 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
12550 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
12560 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
12570 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
12580 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
12590 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
125a0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
125b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
125c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
125d0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
125e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
125f0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
12600 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
12610 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
12620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12630 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
12640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
12650 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
12660 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
12670 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
12680 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
12690 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
126a0 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
126b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
126c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
126d0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
126e0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
126f0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
12700 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12710 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12730 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
12740 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
12750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12760 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
12770 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12780 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
12790 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
127a0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
127b0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
127c0 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
127d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
127e0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
127f0 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
12800 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
12810 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53  e */.    pcacheS
12820 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20 20  ize      +      
12830 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
12840 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75  bject */.    jou
12850 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
12860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
12880 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
12890 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b  Vfs->szOsFile  +
128a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
128b0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
128c0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
128d0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
128e0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
128f0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
12900 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
12910 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f   40            /
12920 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
12930 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
12940 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
12950 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
12960 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
12970 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
12980 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12990 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
129a0 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68 65  PCache = (PCache
129b0 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
129c0 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26   pPtr = ((u8 *)&
129d0 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61  pPager[1]) + pca
129e0 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  cheSize;.  pPage
129f0 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
12a00 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
12a10 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
12a20 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
12a30 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
12a40 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
12a50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
12a60 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
12a70 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile];.  pPager->
12a80 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
12a90 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
12aa0 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e 61  >szOsFile+journa
12ab0 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
12ac0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
12ad0 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
12ae0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a  Vfs->szOsFile+2*
12af0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
12b00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
12b10 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
12b20 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
12b30 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
12b40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
12b50 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
12b60 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
12b70 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
12b80 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a 50  = pVfs;.  if( zP
12b90 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d  athname ){.    m
12ba0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
12bb0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
12bc0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
12bd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12be0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
12bf0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
12c00 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
12c10 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
12c20 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
12c30 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
12c40 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
12c50 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
12c60 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a 65 6f  ame - (int)sizeo
12c70 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29  f("-journal")) )
12c80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
12c90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
12ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
12cb0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
12cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12cd0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
12ce0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
12cf0 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20  Pager->fd,.     
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46      pPager->vfsF
12d20 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
12d30 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
12d40 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
12d50 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
12d60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
12d70 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
12d80 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
12d90 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
12da0 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  .      ** choose
12db0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
12dc0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
12dd0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
12de0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
12df0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
12e00 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
12e10 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
12e20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
12e30 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
12e40 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
12e50 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20  IZE,.      **   
12e60 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
12e70 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
12e80 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
12e90 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
12ea0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
12eb0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
12ec0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
12ed0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
12ee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12ef0 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
12f00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53   ){.        setS
12f10 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
12f20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
12f30 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
12f40 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
12f50 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
12f60 44 66 6c 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Dflt = pPager->s
12f70 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
12f80 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
12f90 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
12fa0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
12fb0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12fc0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
12fd0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
12fe0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
12ff0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
13000 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
13010 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
13020 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
13030 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
13040 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
13050 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
13060 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
13070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
13080 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
13090 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
130a0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
130b0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
130c0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
130d0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
130e0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
130f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
13100 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
13110 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
13120 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
13130 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13140 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13150 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
13160 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58  eDflt>SQLITE_MAX
13170 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
13180 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
13190 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
131a0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
131b0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
131c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
131d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
131e0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
131f0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
13200 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
13210 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
13220 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
13230 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
13240 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
13250 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
13260 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
13270 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
13280 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
13290 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
132a0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
132b0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
132c0 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
132d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
132e0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
132f0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
13300 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
13310 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
13320 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
13330 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
13340 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
13350 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
13360 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
13370 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
13380 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
13390 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
133a0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
133b0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20  }..  if( pPager 
133c0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
133d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
133e0 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
133f0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a  te3PageMalloc(sz
13400 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a  PageDflt);.  }..
13410 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
13420 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
13430 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
13440 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
13450 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
13460 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
13470 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
13480 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
13490 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
134a0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
134b0 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
134c0 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
134d0 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
134e0 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
134f0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
13500 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
13510 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13520 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
13530 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
13540 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
13550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
13560 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
13570 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f   }.  nExtra = FO
13580 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
13590 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
135a0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
135b0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
135c0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
135d0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
135e0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
135f0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
13600 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
13610 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
13620 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
13630 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
13640 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
13650 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
13660 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
13670 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
13680 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
13690 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69  ename))..  /* Fi
136a0 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72  ll in Pager.zDir
136b0 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65  ectory[] */.  me
136c0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  mcpy(pPager->zDi
136d0 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d  rectory, pPager-
136e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
136f0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28  hname+1);.  for(
13700 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  i=sqlite3Strlen3
13710 30 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  0(pPager->zDirec
13720 74 6f 72 79 29 3b 20 0a 20 20 20 20 20 20 69 3e  tory); .      i>
13730 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
13740 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
13750 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
13760 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
13770 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
13780 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  0;..  /* Fill in
13790 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b   Pager.zJournal[
137a0 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  ] */.  if( zPath
137b0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63  name ){.    memc
137c0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
137d0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
137e0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
137f0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
13800 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
13810 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
13820 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d  ournal", 9);.  }
13830 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
13840 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  ->zJournal = 0;.
13850 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72    }..  /* pPager
13860 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13870 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13880 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
13890 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
138a0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
138b0 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
138c0 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
138d0 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
138e0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
138f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
13900 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
13910 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
13920 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
13930 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
13940 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
13950 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13960 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20  = szPageDflt;.  
13970 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
13980 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
13990 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
139a0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
139b0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
139c0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
139d0 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
139e0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
139f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
13a00 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
13a10 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
13a20 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
13a30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13a40 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
13a50 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
13a60 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
13a70 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
13a80 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
13a90 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
13aa0 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
13ab0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
13ac0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
13ad0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
13ae0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
13af0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
13b00 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
13b10 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
13b20 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
13b30 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
13b40 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
13b50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13b60 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
13b70 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
13b80 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
13b90 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
13ba0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
13bb0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
13bc0 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
13bd0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
13be0 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = (pPager->tempF
13bf0 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
13c00 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  al) ?1:0;.  pPag
13c10 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
13c20 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
13c30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
13c40 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
13c50 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
13c60 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
13c70 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
13c80 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13c90 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
13ca0 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
13cb0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
13cc0 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
13cd0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
13ce0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
13cf0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
13d00 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
13d10 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  T;.  assert(pPag
13d20 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
13d30 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  ||tempFile);.  s
13d40 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
13d50 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44  ger);.  if( memD
13d60 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
13d70 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
13d80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13d90 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
13da0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
13db0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
13dc0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
13dd0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
13de0 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
13df0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
13e00 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
13e10 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
13e20 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
13e30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13e40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
13e50 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
13e60 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
13e70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
13e80 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
13e90 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
13ea0 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  r, .  int (*xBus
13eb0 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
13ec0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  ),.  void *pBusy
13ed0 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20 0a  HandlerArg.){  .
13ee0 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
13ef0 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
13f00 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
13f10 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
13f20 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
13f30 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rg;.}../*.** Set
13f40 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
13f50 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
13f60 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
13f70 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
13f80 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
13f90 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
13fa0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
13fb0 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
13fc0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
13fd0 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
13fe0 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
13ff0 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
14000 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
14010 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
14020 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
14030 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
14040 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
14050 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
14060 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
14070 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14080 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
14090 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
140a0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
140b0 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50  (DbPage*)){.  pP
140c0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
140d0 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
140e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
140f0 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53   size to *pPageS
14100 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67  ize. If the sugg
14110 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a  est new page siz
14120 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70  e is.** inapprop
14130 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
14140 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
14150 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
14160 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66  hat.** value bef
14170 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
14180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
14190 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
141a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
141b0 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20   *pPageSize){.  
141c0 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
141d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
141f0 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
14200 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
14210 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
14220 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
14230 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
14240 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
14250 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
14260 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
14270 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
14280 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
14290 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
142a0 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
142b0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
142c0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
142d0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
142e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
142f0 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
14300 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
14310 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
14320 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
14330 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
14340 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
14350 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14370 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14380 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14390 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
143a0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
143b0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
143c0 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74 53  er->memDb ) setS
143d0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
143e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
143f0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
14400 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
14410 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
14420 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
14430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14440 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
14450 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
14460 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
14470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14480 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
14490 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
144a0 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
144b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
144c0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
144d0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
144e0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
144f0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
14500 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
14510 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
14520 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
14530 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
14540 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
14550 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
14560 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
14570 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
14580 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
14590 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
145a0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
145b0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
145c0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
145d0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
145e0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
145f0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
14600 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
14610 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
14620 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
14630 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
14640 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
14650 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
14660 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14670 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
14680 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
14690 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
146a0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
146b0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
146c0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
146d0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
146e0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
146f0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
14700 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
14710 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
14720 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
14730 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14740 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
14750 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
14760 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
14770 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
14780 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
14790 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
147a0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
147b0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
147c0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
147d0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
147e0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
147f0 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
14800 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14810 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65  pPager, 0);.  re
14820 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
14830 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
14840 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
14850 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
14860 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
14870 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
14880 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
14890 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
148a0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
148b0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
148c0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
148d0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
148e0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
148f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
14900 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
14910 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
14920 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
14930 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
14940 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
14950 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
14960 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
14970 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
14980 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
14990 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
149a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
149b0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
149c0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
149d0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
149e0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
149f0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
14a00 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
14a10 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
14a20 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
14a30 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
14a40 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
14a50 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
14a60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
14a70 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
14a80 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
14a90 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
14aa0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
14ab0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
14ac0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
14ad0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
14ae0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14af0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
14b00 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
14b10 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
14b20 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
14b30 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
14b40 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
14b50 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
14b60 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
14b70 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
14b80 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
14b90 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
14ba0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
14bb0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
14bc0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
14bd0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
14be0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
14bf0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
14c00 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
14c10 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
14c20 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
14c30 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
14c40 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
14c50 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
14c60 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
14c70 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
14c80 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
14c90 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
14ca0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
14cb0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
14cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14cd0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
14ce0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
14cf0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
14d00 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
14d10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14d20 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
14d30 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
14d40 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
14d50 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
14d60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
14d70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
14d80 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
14d90 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
14da0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
14db0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
14dc0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
14dd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
14de0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
14df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
14e00 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
14e10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14e20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
14e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14e40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14e50 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
14e60 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
14e70 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
14e80 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
14e90 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
14ea0 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
14eb0 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
14ec0 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
14ed0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
14ee0 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
14ef0 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
14f00 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
14f10 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
14f20 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
14f30 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
14f40 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
14f50 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
14f60 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
14f70 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
14f80 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
14f90 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
14fa0 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
14fb0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14fc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
14fd0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
14fe0 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 n = 0;.  int
14ff0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
15000 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
15010 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
15020 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
15030 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
15040 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15050 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
15060 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
15070 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
15080 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
15090 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
150a0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
150b0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
150c0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
150d0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
150e0 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
150f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15100 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
15110 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
15120 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
15130 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15140 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15150 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
15160 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
15170 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
15180 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
15190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
151a0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
151b0 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
151c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
151d0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
151e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
151f0 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e 3b  bSize = (Pgno)n;
15200 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15210 62 46 69 6c 65 53 69 7a 65 20 3d 20 28 50 67 6e  bFileSize = (Pgn
15220 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67 65  o)n;.      pPage
15230 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
15240 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
15250 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
15260 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
15270 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
15280 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
15290 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
152a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
152b0 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20  gno = (Pgno)n;. 
152c0 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20   }.  if( pnPage 
152d0 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d  ){.    *pnPage =
152e0 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20 20 72   (int)n;.  }.  r
152f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
15310 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
15320 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
15330 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
15340 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
15350 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
15360 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
15370 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
15380 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
15390 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
153a0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
153b0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
153c0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
153d0 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
153e0 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
153f0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
15400 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
15410 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
15420 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
15430 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
15440 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
15450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15460 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
15470 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
15480 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
15490 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
154a0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
154b0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
154c0 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
154d0 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
154e0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
154f0 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
15500 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
15510 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
15520 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
15530 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
15540 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
15550 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
15560 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
15570 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
15580 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
15590 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
155a0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
155b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
155c0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
155d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
155e0 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  id==0 );..  if( 
155f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
15600 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
15610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
15630 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15640 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
15650 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
15660 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
15670 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
15680 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
15690 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
156a0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
156b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
156c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
156d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
156e0 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
156f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
15700 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
15710 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
15720 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15730 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
15740 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15750 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
15760 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
15770 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
15780 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
15790 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
157a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
157b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
157c0 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
157d0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
157e0 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
157f0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
15800 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
15810 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
15820 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
15830 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
15840 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
15850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
15860 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  committed..*/.vo
15870 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
15880 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
15890 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
158a0 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
158b0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
158c0 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65  eValid );.  asse
158d0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
158e0 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70  ze>=nPage );.  p
158f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
15900 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
15910 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
15920 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
15930 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
15940 67 65 20 69 6e 20 70 61 67 65 73 2e 20 54 68 69  ge in pages. Thi
15950 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 69  s.** function di
15960 66 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69 74  ffers from sqlit
15970 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
15980 28 29 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a  () in two ways:.
15990 2a 2a 0a 2a 2a 20 20 61 29 20 49 74 20 6d 61 79  **.**  a) It may
159a0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
159b0 77 68 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  when at least on
159c0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  e reference to a
159d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
159e0 20 70 61 67 65 20 69 73 20 68 65 6c 64 2e 20 54   page is held. T
159f0 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
15a00 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
15a10 20 73 69 7a 65 20 69 73 20 61 6c 72 65 61 64 79   size is already
15a20 0a 2a 2a 20 20 20 20 20 6b 6e 6f 77 6e 20 61 6e  .**     known an
15a30 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  d a call to sqli
15a40 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  te3OsFileSize() 
15a50 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
15a60 0a 2a 2a 0a 2a 2a 20 20 62 29 20 54 68 65 20 72  .**.**  b) The r
15a70 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6e  eturn value is n
15a80 6f 74 20 61 64 6a 75 73 74 65 64 20 66 6f 72 20  ot adjusted for 
15a90 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
15aa0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
15ab0 33 50 61 67 65 72 49 6d 61 67 65 53 69 7a 65 28  3PagerImageSize(
15ac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15ad0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15ae0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
15af0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15b00 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ->dbSize;.}.#end
15b10 69 66 20 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  if  /* ifndef SQ
15b20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15b30 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  CUUM */../*.** S
15b40 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
15b50 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
15b60 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
15b70 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
15b80 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
15b90 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
15ba0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
15bb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15bc0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
15bd0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
15be0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
15bf0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
15c00 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
15c10 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
15c20 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
15c30 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
15c40 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
15c50 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
15c60 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
15c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
15c80 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
15c90 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
15ca0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
15cb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
15cc0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
15cd0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
15ce0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
15cf0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
15d00 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
15d10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15d20 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
15d30 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
15d40 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
15d50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
15d60 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
15d70 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
15d80 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
15d90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
15da0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
15db0 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 64  r *pPager){..  d
15dc0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
15dd0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
15de0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
15df0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50  gnMalloc();.  pP
15e00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
15e10 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
15e20 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
15e30 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
15e40 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
15e50 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  MDB ){.    /* Se
15e60 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
15e70 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
15e80 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
15e90 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
15ea0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
15eb0 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
15ec0 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
15ed0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
15ee0 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
15ef0 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
15f00 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
15f10 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
15f20 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
15f30 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
15f40 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
15f50 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15f60 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
15f70 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
15f80 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
15f90 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
15fa0 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
15fb0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
15fc0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15fd0 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  alHdr = -1;.    
15fe0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
15ff0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
16000 20 20 7d 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d    }.  enable_sim
16010 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
16020 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  ();.  sqlite3End
16030 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
16040 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
16050 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
16060 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
16070 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
16080 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
16090 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
160a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
160b0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
160c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
160d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
160e0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
160f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
16100 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
16110 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
16120 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
16130 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
16140 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  point(pPager);. 
16150 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
16160 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
16170 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
16180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
16190 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
161a0 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
161b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
161c0 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
161d0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
161e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
161f0 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50    */..  sqlite3P
16200 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
16210 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
16220 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
16230 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
16240 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
16250 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
16260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16270 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
16280 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
16290 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
162a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
162b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
162c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
162d0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
162e0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
162f0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
16300 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
16310 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16320 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
16330 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
16340 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
16350 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
16360 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
16370 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
16380 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
16390 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
163a0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
163b0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
163c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
163d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
163e0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
163f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
16400 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
16410 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
16420 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
16430 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
16440 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
16450 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
16460 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
16470 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
16480 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
16490 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
164a0 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
164b0 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
164c0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
164d0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
164e0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
164f0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
16500 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
16510 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
16520 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
16530 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
16540 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
16550 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
16560 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
16570 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
16580 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
16590 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
165a0 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
165b0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
165c0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
165d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
165e0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
165f0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
16600 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
16610 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
16620 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
16630 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
16640 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
16650 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
16660 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
16670 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
16680 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
16690 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
166a0 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
166b0 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
166c0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
166d0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
166e0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
166f0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
16700 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
16710 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
16720 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
16730 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
16740 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
16750 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
16760 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  o no sync occurs
16770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
16780 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
16790 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
167a0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
167b0 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a  edia on which.**
167c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
167d0 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73   stored, then Os
167e0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
167f0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f  called on the jo
16800 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49  urnal.** file. I
16810 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
16820 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
16830 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68   is to update th
16840 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a  e nRec field in.
16850 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
16860 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eader..**.** Thi
16870 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
16880 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
16890 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
168a0 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
168b0 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
168c0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
168d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
168e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
168f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
16900 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
16910 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
16920 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
16930 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
16940 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
16950 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
16960 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
16970 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
16980 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
16990 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
169a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
169b0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
169c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
169d0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
169e0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
169f0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
16a00 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
16a10 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
16a20 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
16a30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16a40 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
16a50 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
16a60 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
16a70 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
16a80 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
16a90 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
16aa0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
16ab0 20 20 20 20 20 20 20 75 38 20 7a 4d 61 67 69 63         u8 zMagic
16ac0 5b 38 5d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  [8];..        /*
16ad0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
16ae0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
16af0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
16b00 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
16b10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
16b20 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
16b30 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
16b40 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
16b50 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
16b60 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
16b70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16b80 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
16b90 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
16ba0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
16bb0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
16bc0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
16bd0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
16be0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
16bf0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
16c00 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
16c10 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
16c20 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
16c30 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
16c40 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
16c50 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63  nections transac
16c60 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
16c70 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
16c80 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
16c90 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
16ca0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
16cb0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
16cc0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
16cd0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
16ce0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
16cf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
16d00 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
16d10 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
16d20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
16d30 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
16d40 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
16d50 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
16d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
16d70 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16d80 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
16d90 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
16da0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
16db0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
16dc0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
16dd0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
16de0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
16df0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
16e00 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
16e10 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
16e20 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
16e30 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
16e40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
16e50 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
16e60 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
16e70 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
16e80 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
16e90 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
16ea0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
16eb0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
16ec0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
16ed0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
16ee0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
16ef0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
16f00 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
16f10 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
16f20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
16f40 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
16f50 20 7a 4d 61 67 69 63 2c 20 38 2c 20 6a 72 6e 6c   zMagic, 8, jrnl
16f60 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
16f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16f80 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4d 61  && 0==memcmp(zMa
16f90 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
16fa0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
16fb0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
16fc0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
16fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16fe0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
16ff0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
17000 72 6f 62 79 74 65 2c 20 31 2c 20 6a 72 6e 6c 4f  robyte, 1, jrnlO
17010 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
17020 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
17040 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17050 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
17060 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17070 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17080 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17090 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
170a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
170b0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
170c0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
170d0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
170e0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
170f0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
17100 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
17110 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
17120 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
17130 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
17140 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
17150 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
17160 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
17170 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
17180 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
17190 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
171a0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
171b0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
171c0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
171d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
171e0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
171f0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
17200 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
17210 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
17220 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
17230 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
17240 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
17250 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
17260 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
17270 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
17280 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
17290 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
172a0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
172b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
172c0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
172d0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
172e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
172f0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
17300 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
17310 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
17320 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
17330 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
17340 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
17350 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17360 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
17370 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
17380 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
17390 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
173a0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
173b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
173c0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
173d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
173e0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
173f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17400 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
17410 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17420 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
17430 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
17440 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
17450 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
17460 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
17470 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
17480 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
17490 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
174a0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
174b0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
174c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
174d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
174e0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
174f0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
17500 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
17510 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
17520 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
17530 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17540 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
17550 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
17560 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
17570 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17580 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
17590 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
175a0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
175b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
175c0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
175d0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
175e0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
175f0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
17600 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
17610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17620 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
17630 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
17640 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17650 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17660 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
17670 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
17680 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
17690 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
176a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
176b0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
176c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
176d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
176e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
176f0 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
17700 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
17710 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
17720 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
17730 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
17740 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
17750 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17760 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72  ile. No calls ar
17770 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  e made.** to the
17780 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20 6d   page-cache to m
17790 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61 73  ark the pages as
177a0 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74 68   clean. It is th
177b0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
177c0 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
177d0 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65 43  r to use PcacheC
177e0 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61  leanAll() or Pca
177f0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74  cheMakeClean() t
17800 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61  o mark.** the pa
17810 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  ges as clean..*/
17820 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17830 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
17840 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
17850 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
17860 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
17870 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
17880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17890 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
178a0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
178b0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
178c0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
178d0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
178e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
178f0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
17900 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
17910 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
17920 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
17930 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
17940 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
17950 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
17960 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
17970 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
17980 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
17990 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
179a0 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
179b0 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
179c0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
179d0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
179e0 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
179f0 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
17a00 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
17a10 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
17a20 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
17a30 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
17a40 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
17a50 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
17a60 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
17a70 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
17a80 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
17a90 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
17aa0 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
17ab0 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
17ac0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
17ad0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
17ae0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
17af0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
17b00 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
17b10 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
17b20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
17b30 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
17b40 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
17b50 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
17b60 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
17b70 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
17b80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
17b90 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
17ba0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
17bb0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
17bc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17bd0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
17be0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
17bf0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
17c00 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
17c10 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
17c20 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
17c30 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
17c40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
17c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17c70 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
17c80 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
17c90 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
17ca0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
17cb0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
17cc0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
17cd0 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
17ce0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
17cf0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
17d00 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
17d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17d20 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
17d30 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
17d40 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
17d50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
17d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17d70 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
17d80 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
17d90 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
17da0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
17db0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
17dc0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
17dd0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
17de0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
17df0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
17e00 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
17e10 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
17e20 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
17e30 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
17e40 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
17e50 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
17e60 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
17e70 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
17e80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
17e90 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
17ea0 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
17eb0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
17ec0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
17ed0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
17ee0 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  t = (pList->pgno
17ef0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
17f00 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
17f10 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
17f20 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
17f30 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73  ist->pData, pLis
17f40 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20 20  t->pgno, 6);..  
17f50 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
17f60 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
17f70 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
17f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f90 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17fa0 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
17fb0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
17fc0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
17fd0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
17fe0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
17ff0 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29  r, pList->pgno))
18000 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18010 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
18020 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
18030 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
18040 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
18050 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
18060 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
18070 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
18080 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
18090 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20  ->nWrite);.     
180a0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
180b0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
180c0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
180d0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
180e0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
180f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
18100 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
18110 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
18120 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18130 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18140 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
18150 7a 65 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ze = pList->pgno
18160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18170 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
18180 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
18190 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
181a0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
181b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
181c0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
181d0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
181e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
181f0 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53  urn rc;.#ifdef S
18200 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
18210 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
18220 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
18230 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
18240 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
18250 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
18260 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
18270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18280 2a 2a 20 41 64 64 20 74 68 65 20 70 61 67 65 20  ** Add the page 
18290 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
182a0 61 6c 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  al. It is the ca
182b0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
182c0 6c 69 74 79 20 74 6f 0a 2a 2a 20 75 73 65 20 73  lity to.** use s
182d0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
182e0 29 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  ) to check that 
182f0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
18300 75 69 72 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  uired before .**
18310 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
18320 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
18330 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
18340 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
18350 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f  {.  int rc;.  vo
18360 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
18370 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
18380 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
18390 50 61 67 65 72 3b 0a 20 20 69 36 34 20 6f 66 66  Pager;.  i64 off
183a0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
183b0 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
183c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 63  ->pageSize);.  c
183d0 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
183e0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
183f0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
18400 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
18410 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
18420 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
18430 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
18440 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20  pPg->pgno));..  
18450 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
18460 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
18470 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
18480 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
18490 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
184a0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
184b0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
184c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
184d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
184e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
184f0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
18500 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
18510 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
18520 2b 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +4);.  }.  if( r
18530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18540 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18550 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  NRec++;.    asse
18560 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
18570 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
18580 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
18590 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
185a0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
185b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
185c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
185d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
185e0 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
185f0 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
18600 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
18610 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
18620 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  mit. The argumen
18630 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
18640 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20 50 61  o a purgeable Pa
18650 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  ger .** object. 
18660 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
18670 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20 61  tempts to make a
18680 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20 70 61   single dirty pa
18690 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f 0a 2a  ge that has no.*
186a0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  * outstanding re
186b0 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f 6e 65  ferences (if one
186c0 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e 20 73   exists) clean s
186d0 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
186e0 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20 62 79   recycled .** by
186f0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
18700 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
18710 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
18720 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
18730 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
18740 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
18750 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18760 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
18770 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
18780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
187a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
187b0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
187c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
187d0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
187e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  OK ){.    if( pP
187f0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
18800 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
18810 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
18820 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
18830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18840 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
18850 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20  ullSync && .    
18860 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
18870 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
18880 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
18890 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20 20  ORY) &&.        
188a0 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  !(sqlite3OsDevic
188b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
188c0 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
188d0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
188e0 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a  PPEND).      ){.
188f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18900 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
18910 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
18920 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
18930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18950 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
18960 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
18970 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
18980 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
18990 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
189a0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
189b0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
189c0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
189d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
189e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
189f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
18a00 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
18a10 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
18a20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a40 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
18a50 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
18a60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a80 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
18a90 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
18aa0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
18ab0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
18ac0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
18ad0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
18ae0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  n(pPg);.  }.  re
18af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18b00 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
18b10 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
18b20 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
18b30 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
18b40 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
18b50 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
18b60 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
18b70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
18b80 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
18b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18ba0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
18bb0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
18bc0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
18bd0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
18be0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
18bf0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
18c00 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
18c10 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
18c20 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
18c30 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  l..**.** Return 
18c40 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62  negative if unab
18c50 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
18c60 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
18c70 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
18c80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
18c90 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  es not open the 
18ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
18cb0 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63  examine its.** c
18cc0 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20  ontent.  Hence, 
18cd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
18ce0 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  t contain the na
18cf0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a  me of a master.*
18d00 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
18d10 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  hat has been del
18d20 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20  eted, and hence 
18d30 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a  not be hot.  Or.
18d40 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
18d50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
18d60 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74  ht be zeroed out
18d70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
18d80 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63  ** does not disc
18d90 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73  over these cases
18da0 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f   of a non-hot jo
18db0 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a  urnal - if the.*
18dc0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  * journal file e
18dd0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
18de0 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74   empty this rout
18df0 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a  ine assumes it.*
18e00 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70  * is hot.  The p
18e10 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
18e20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
18e30 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a  cover that the.*
18e40 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
18e50 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
18e60 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e   and will no-op.
18e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
18e80 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
18e90 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
18ea0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
18eb0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18ec0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
18ed0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18ee0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  _OK;.  int exist
18ef0 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63  s = 0;.  int loc
18f00 6b 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ked = 0;.  asser
18f10 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
18f20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f30 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
18f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f50 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
18f60 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ;.  *pExists = 0
18f70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18f80 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
18f90 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
18fa0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
18fb0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
18fc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18fd0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
18fe0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18ff0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
19000 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
19010 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a  , &locked);.  }.
19020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19030 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26  _OK && exists &&
19040 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
19050 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
19060 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19070 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
19080 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
19090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
190a0 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61   ){.     if( nPa
190b0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
190c0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
190d0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
190e0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
190f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19100 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
19110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19120 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19130 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
19140 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
19150 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
19160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
19170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
19180 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
19190 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
191a0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
191b0 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f   int rc;.  i64 o
191c0 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
191d0 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61   MEMDB==0 );.  a
191e0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
191f0 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
19200 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
19210 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
19220 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
19230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19240 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
19250 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
19260 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
19270 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19280 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19290 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
192a0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
192b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
192c0 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
192d0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
192e0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
192f0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
19300 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
19310 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
19320 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
19330 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
19340 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
19350 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
19360 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
19370 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
19380 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
193c0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
193d0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
193e0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
193f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
19400 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
19410 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
19420 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
19440 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19450 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
19460 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
19470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19480 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19490 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
194a0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
194b0 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
194c0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
194d0 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
194e0 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
194f0 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
19500 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
19510 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
19520 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
19530 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
19540 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
19550 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
19560 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
19570 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
19580 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
19590 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
195a0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
195b0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
195c0 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
195d0 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
195e0 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
195f0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19600 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
19610 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19630 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45  TE_OK;.  int isE
19640 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a  rrorReset = 0;..
19650 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
19660 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
19670 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
19680 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74  cess, has no out
19690 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70  standing .  ** p
196a0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
196b0 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  nd is in an erro
196c0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
196d0 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  the chance to cl
196e0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
196f0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
19700 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
19710 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
19720 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
19730 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
19740 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
19750 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
19760 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
19770 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
19780 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
19790 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
197a0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
197b0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
197c0 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  e .  ){.    if( 
197d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
197e0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45  pen ){.      isE
197f0 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
19800 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
19810 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
19820 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
19830 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
19840 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
19850 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
19860 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
19870 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
19880 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
19890 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
198a0 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
198b0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
198c0 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
198d0 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
198e0 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
198f0 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
19900 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
19910 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
19920 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
19930 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
19940 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
19950 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19960 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
19970 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
19980 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
19990 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
199a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
199b0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
199c0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  r->pVfs;.    int
199d0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20   isHotJournal = 
199e0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
199f0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
19a00 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
19a10 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
19a20 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
19a30 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
19a40 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
19a50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19a60 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
19a70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
19a80 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
19a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19ab0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19ac0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
19ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
19ae0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
19af0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
19b00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
19b10 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19b20 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
19b30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
19b40 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
19b50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19b60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19b70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
19b80 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
19b90 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
19ba0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
19bb0 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
19bc0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
19bd0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
19be0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
19bf0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
19c00 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
19c10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
19c20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
19c30 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
19c40 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
19c50 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
19c60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c80 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
19c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ca0 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
19cb0 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
19cc0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
19cd0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
19ce0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19cf0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
19d00 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
19d10 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
19d20 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
19d30 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
19d40 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
19d50 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
19d60 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
19d70 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
19d80 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
19d90 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
19da0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
19db0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
19dc0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
19dd0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
19de0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
19df0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
19e00 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
19e10 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
19e20 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
19e30 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
19e40 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
19e50 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
19e60 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
19e70 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
19e80 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
19e90 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
19ea0 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
19eb0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
19ec0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
19ed0 69 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f  il to.      ** o
19ee0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
19ef0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19f00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19f10 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19f20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19f30 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
19f40 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
19f50 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
19f60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
19f70 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
19f80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19fa0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19fb0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
19fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
19fd0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
19fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
19ff0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1a000 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
1a010 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
1a020 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
1a030 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1a040 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
1a050 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
1a060 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
1a070 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
1a080 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
1a090 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
1a0a0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
1a0b0 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
1a0c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
1a0d0 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
1a0e0 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
1a0f0 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
1a100 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
1a110 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a120 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
1a130 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
1a140 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
1a150 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
1a160 20 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72        if( !isErr
1a170 6f 72 52 65 73 65 74 20 26 26 20 70 50 61 67 65  orReset && pPage
1a180 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1a190 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
1a1a0 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
1a1b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1a1c0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
1a1d0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
1a1e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
1a1f0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
1a200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a210 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1a220 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
1a230 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1a240 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1a250 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
1a260 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1a270 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1a280 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
1a290 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1a2a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1a2b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a2c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1a2d0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1a2e0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1a2f0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
1a300 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1a310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1a320 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1a330 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
1a340 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1a350 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
1a360 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
1a370 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
1a380 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1a390 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
1a3a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a3b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1a3c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
1a3d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a3f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1a400 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
1a410 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
1a420 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
1a430 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
1a440 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
1a450 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
1a460 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a470 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1a480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1a4c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1a4d0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1a4e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1a4f0 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  1;.      pPager-
1a500 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1a510 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
1a520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1a530 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
1a540 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1a550 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1a560 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
1a570 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
1a580 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
1a590 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
1a5a0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
1a5b0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
1a5c0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
1a5d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
1a5e0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
1a5f0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
1a600 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
1a610 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
1a620 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
1a630 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
1a640 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
1a650 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f   cache..      */
1a660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1a670 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
1a680 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
1a690 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1a6a0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
1a6b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a6c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a6d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a6e0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1a6f0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1a700 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
1a710 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1a720 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1a730 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
1a740 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
1a750 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
1a760 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
1a770 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1a780 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
1a790 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1a7a0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
1a7b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
1a7c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
1a7d0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
1a7e0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
1a7f0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1a800 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
1a810 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
1a820 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
1a830 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
1a840 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1a850 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
1a860 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
1a870 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1a880 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1a890 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
1a8a0 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
1a8b0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
1a8c0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
1a8d0 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
1a8e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1a8f0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
1a900 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
1a910 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
1a920 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
1a930 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
1a940 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
1a950 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
1a960 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
1a970 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
1a980 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
1a990 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
1a9a0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
1a9b0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
1a9c0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
1a9d0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
1a9e0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
1a9f0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
1aa00 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
1aa10 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
1aa20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
1aa30 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1aa40 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1aa50 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1aa60 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1aa70 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1aa80 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1aa90 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1aaa0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1aab0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
1aac0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
1aad0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1aae0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
1aaf0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
1ab00 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
1ab10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ab20 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1ab30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
1ab40 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ab50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ab60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ab70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
1ab80 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
1ab90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1aba0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1abb0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
1abc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
1abd0 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
1abe0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
1abf0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
1ac00 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1ac10 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1ac20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1ac30 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
1ac40 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1ac50 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
1ac60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1ac70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ac80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1ac90 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
1aca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1acb0 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
1acc0 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
1acd0 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
1ace0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1acf0 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
1ad00 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1ad10 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1ad20 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
1ad30 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
1ad40 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1ad50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ad60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ad70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1ad80 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
1ad90 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
1ada0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
1adb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1adc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
1add0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
1ade0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
1adf0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
1ae00 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ae10 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
1ae20 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
1ae30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ae40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1ae50 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65  sure we have the
1ae60 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70   content for a p
1ae70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
1ae80 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  e was.** previou
1ae90 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1aea0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1aeb0 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1aec0 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69   was.** just ini
1aed0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1aee0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69  s instead of bei
1aef0 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ng read from dis
1af00 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65  k..** But now we
1af10 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64   need the real d
1af20 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e  ata off of disk.
1af30 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77    So make sure w
1af40 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52  e.** have it.  R
1af50 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20  ead it in if we 
1af60 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61  do not have it a
1af70 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69  lready..*/.stati
1af80 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f  c int pager_get_
1af90 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70  content(PgHdr *p
1afa0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1afb0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1afc0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e 74  _READ ){.    int
1afd0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1afe0 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50  (pPg->pPager, pP
1aff0 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  g, pPg->pgno);. 
1b000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
1b020 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
1b030 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
1b040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1b050 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b060 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b070 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b080 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
1b090 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
1b0a0 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74 68  hed zero, and th
1b0b0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
1b0c0 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65 20  n the.** middle 
1b0d0 6f 66 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  of a write trans
1b0e0 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65 64  action or opened
1b0f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
1b100 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a  de, unlock it..*
1b110 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
1b120 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
1b130 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
1b140 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
1b150 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
1b160 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1b170 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70 50  ==0).    && (!pP
1b180 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1b190 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
1b1a0 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20  ournalOff>0) .  
1b1b0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
1b1c0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
1b1d0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
1b1e0 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20  .** Drop a page 
1b1f0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75  from the cache u
1b200 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  sing sqlite3Pcac
1b210 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  heDrop()..**.** 
1b220 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
1b230 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70  ere are now no p
1b240 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72 65  ages with refere
1b250 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20  nces to them, a 
1b260 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
1b270 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
1b280 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b290 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73  is removed..*/.s
1b2a0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1b2b0 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65 20  DropPage(DbPage 
1b2c0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1b2d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b2e0 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  ager;.  sqlite3P
1b2f0 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
1b300 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
1b310 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
1b320 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1b330 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1b340 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b350 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1b360 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1b370 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1b380 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1b390 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1b3a0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1b3b0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1b3c0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1b3d0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1b3e0 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1b3f0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1b400 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1b410 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1b420 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1b430 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1b440 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1b450 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1b460 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1b470 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1b480 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1b490 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1b4a0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1b4b0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1b4c0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1b4d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1b4e0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1b4f0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1b500 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1b510 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1b520 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1b530 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1b540 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1b550 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1b560 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1b570 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b580 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1b590 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1b5a0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1b5b0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1b5c0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1b5d0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1b5e0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1b5f0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1b600 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1b610 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1b620 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1b630 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1b640 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1b650 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1b660 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1b670 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1b680 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1b690 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1b6a0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1b6b0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1b6c0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1b6d0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1b6e0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1b6f0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1b700 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1b710 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1b720 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1b730 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1b740 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1b750 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1b760 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1b770 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1b780 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1b790 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1b7a0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1b7b0 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1b7c0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1b7d0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1b7e0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1b7f0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1b800 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1b810 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1b820 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1b830 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1b840 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1b850 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1b860 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1b870 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1b880 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1b890 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1b8a0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1b8b0 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1b8c0 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1b8d0 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1b8e0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1b8f0 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1b900 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1b910 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1b920 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1b930 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1b940 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1b950 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1b960 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1b970 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1b980 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1b990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b9a0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1b9b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1b9c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1b9d0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1b9e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1b9f0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1ba00 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1ba10 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1ba20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1ba30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1ba40 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1ba50 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1ba60 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1ba70 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1ba80 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1ba90 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1baa0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1bab0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e  r *pPg = 0;.  in
1bac0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1bad0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1bae0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
1baf0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
1bb00 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
1bb10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
1bb20 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f   .       || pgno
1bb30 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  ==1.  );..  /* T
1bb40 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1bb50 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1bb60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1bb70 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1bb80 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1bb90 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1bba0 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1bbb0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1bbc0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1bbd0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1bbe0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1bbf0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1bc00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1bc10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1bc20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1bc30 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1bc40 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1bc50 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1bc60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bc70 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1bc80 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
1bc90 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bca0 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1bcb0 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1bcc0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1bcd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bce0 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1bcf0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1bd00 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1bd10 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1bd20 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1bd30 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1bd40 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1bd50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bd60 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1bd70 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1bd80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1bd90 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1bda0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1bdb0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
1bdc0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
1bdd0 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  no, 1, &pPg);.  
1bde0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bdf0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1be00 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
1be10 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  g->pPager==0 ){.
1be20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1be30 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
1be40 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
1be50 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
1be60 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
1be70 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20  nitialized..    
1be80 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
1be90 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
1bea0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
1beb0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
1bec0 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d 65  = pPager;.    me
1bed0 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61  mset(pPg->pExtra
1bee0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
1bef0 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  tra);..    rc = 
1bf00 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1bf10 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
1bf20 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Max);.    if( rc
1bf30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bf40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1bf50 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1bf60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1bf70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61    }..    if( nMa
1bf80 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  x<(int)pgno || M
1bf90 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  EMDB || noConten
1bfa0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
1bfb0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
1bfc0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  no ){.        sq
1bfd0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1bfe0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
1bff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1c000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c010 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c020 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c030 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
1c040 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
1c050 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
1c060 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1c070 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20  _READ;.      }. 
1c080 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
1c090 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
1c0a0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1c0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c0c0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1c0d0 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
1c0e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1c100 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
1c110 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c120 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50       /* sqlite3P
1c130 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20  agerUnref(pPg); 
1c140 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
1c150 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20  DropPage(pPg);. 
1c160 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c180 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1c190 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
1c1a0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1c1b0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1c1c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
1c1d0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
1c1e0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
1c1f0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1c200 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1c210 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
1c220 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
1c230 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e  PCache)>0 || pgn
1c240 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
1c250 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
1c260 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
1c270 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1c280 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1c290 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1c2a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1c2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c2c0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1c2d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c2e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c2f0 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   }..  *ppPage = 
1c300 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1c310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c320 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1c330 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
1c340 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
1c350 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
1c360 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
1c370 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
1c380 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1c390 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
1c3a0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
1c3b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
1c3c0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1c3d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1c3e0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
1c3f0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1c400 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
1c410 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1c420 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
1c430 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
1c440 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
1c450 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
1c460 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1c470 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
1c480 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1c490 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
1c4a0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1c4b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
1c4c0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
1c4d0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
1c4e0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
1c4f0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
1c500 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
1c510 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1c520 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1c530 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1c540 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1c550 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1c560 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ..  if( (pPager-
1c570 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1c580 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61  LOCK).   && (pPa
1c590 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
1c5a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c5b0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
1c5c0 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20  TE_FULL).  ){.  
1c5d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
1c5e0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
1c5f0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
1c600 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
1c610 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
1c620 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
1c630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1c640 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
1c650 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
1c660 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
1c670 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
1c680 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
1c690 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
1c6a0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
1c6b0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
1c6c0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
1c6d0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
1c6e0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
1c6f0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
1c700 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
1c710 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1c720 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1c730 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1c740 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c750 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1c760 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1c770 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
1c780 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
1c790 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
1c7a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1c7b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1c7c0 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
1c7d0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
1c7e0 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
1c7f0 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
1c800 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
1c810 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
1c820 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
1c830 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
1c840 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
1c850 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1c860 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1c870 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c880 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
1c890 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
1c8a0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
1c8b0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
1c8c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c8d0 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  d if the call to
1c8e0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70   .** sqlite3OsOp
1c8f0 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  en() fails..*/.s
1c900 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
1c910 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
1c920 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c930 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c940 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c950 72 6e 61 6c 4f 70 65 6e 20 26 26 20 21 70 50 61  rnalOpen && !pPa
1c960 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68  ger->sjfd->pMeth
1c970 6f 64 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ods ){.    if( p
1c980 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1c990 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1c9a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
1c9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
1c9c0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
1c9d0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
1c9e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1ca00 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1ca10 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
1ca20 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1ca30 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
1ca40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca50 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1ca60 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1ca70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1ca80 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1ca90 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1caa0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1cab0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cac0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1cad0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1cae0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1caf0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1cb00 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1cb10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1cb20 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1cb30 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1cb40 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1cb50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1cb60 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1cb70 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1cb80 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
1cb90 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1cba0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
1cbb0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1cbc0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1cbd0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1cbe0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
1cbf0 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
1cc00 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
1cc10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1cc20 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1cc30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cc40 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
1cc50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cc60 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1cc70 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1cc80 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1cc90 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  , 0);.  pPager->
1cca0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
1ccb0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
1ccc0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
1ccd0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1cce0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
1ccf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1cd00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
1cd10 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1cd20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
1cd30 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1cd40 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
1cd50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
1cd60 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
1cd70 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
1cd80 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1cd90 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
1cda0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
1cdb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cdc0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
1cdd0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1cde0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
1cdf0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1ce00 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1ce10 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1ce20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ce30 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
1ce40 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1ce50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ce60 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  OK;.    }else{.#
1ce70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ce80 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1ce90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1cea0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
1ceb0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
1cec0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1ced0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1cee0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
1cef0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
1cf00 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
1cf10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1cf20 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1cf30 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1cf40 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
1cf50 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1cf60 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1cf70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1cf80 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
1cf90 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50 61 67  hods );.    pPag
1cfa0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1cfb0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1cfc0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1cfd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cfe0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 69  alHdr = 0;.    i
1cff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d000 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
1d010 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1d020 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d030 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
1d040 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1d050 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d060 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1d070 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1d080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
1d090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d0a0 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
1d0b0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
1d0c0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
1d0d0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
1d0e0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
1d0f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d100 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
1d110 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1d120 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
1d130 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1d140 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
1d150 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
1d160 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
1d170 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1d180 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1d190 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1d1a0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 72 63 3d  Savepoint && rc=
1d1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d1c0 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
1d1d0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1d1e0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1d1f0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1d200 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63  LITE_NOMEM && rc
1d210 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  !=SQLITE_IOERR_N
1d220 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
1d230 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1d240 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
1d250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d270 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1d280 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
1d290 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
1d2a0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1d2b0 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  al:.  sqlite3Bit
1d2c0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
1d2d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
1d2e0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
1d2f0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
1d300 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d310 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
1d320 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d330 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
1d340 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
1d350 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
1d360 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
1d370 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
1d380 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1d390 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
1d3a0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1d3b0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1d3c0 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
1d3d0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1d3e0 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
1d3f0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1d400 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d410 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
1d420 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
1d430 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
1d440 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
1d450 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
1d460 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
1d470 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
1d480 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
1d490 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
1d4a0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
1d4b0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
1d4c0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
1d4d0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
1d4e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d4f0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1d500 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
1d510 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
1d520 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1d530 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d540 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
1d550 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
1d560 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
1d570 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
1d580 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
1d590 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1d5a0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
1d5b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d5c0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
1d5d0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1d5e0 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
1d5f0 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
1d600 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
1d610 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
1d620 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
1d630 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
1d640 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
1d650 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
1d660 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
1d670 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
1d680 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1d690 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1d6a0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1d6b0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1d6c0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1d6d0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1d6e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1d6f0 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1d700 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1d710 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1d720 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1d730 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1d740 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1d750 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1d760 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1d770 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1d780 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1d790 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1d7a0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1d7b0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1d7c0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1d7d0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1d7e0 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1d7f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d800 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1d810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1d820 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1d830 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1d840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1d850 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1d860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d870 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
1d880 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1d890 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1d8a0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
1d8b0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
1d8c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d8d0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1d8e0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1d8f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d910 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1d920 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
1d930 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61  .      if( exFla
1d940 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
1d950 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1d960 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1d970 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1d980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d990 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d9a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1d9b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1d9c0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1d9d0 68 65 20 3d 20 30 3b 0a 20 20 20 20 50 41 47 45  he = 0;.    PAGE
1d9e0 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
1d9f0 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1da00 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1da10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1da20 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1da30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1da40 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
1da50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1da60 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1da70 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
1da80 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1da90 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1daa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1dab0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1dac0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1dad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
1dae0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1daf0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
1db00 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
1db10 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1db20 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
1db30 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
1db40 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
1db50 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
1db60 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
1db70 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
1db80 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
1db90 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
1dba0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1dbb0 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
1dbc0 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
1dbd0 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
1dbe0 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
1dbf0 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
1dc00 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
1dc10 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
1dc20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1dc30 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
1dc40 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1dc50 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
1dc60 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
1dc70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1dc80 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1dc90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1dca0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1dcb0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
1dcc0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
1dcd0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
1dce0 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  te( pPager->dbSi
1dcf0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ze );.    if( !p
1dd00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1dd10 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1dd20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1dd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1dd40 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1dd50 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1dd60 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1dd70 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1dd80 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1dd90 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1dda0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1ddb0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1ddc0 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1ddd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1dde0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ddf0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
1de00 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
1de10 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
1de20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1de30 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
1de40 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1de50 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
1de60 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
1de70 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
1de80 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
1de90 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
1dea0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1deb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1dec0 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
1ded0 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
1dee0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
1def0 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
1df00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1df10 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
1df20 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
1df30 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
1df40 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
1df50 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1df60 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
1df70 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1df80 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
1df90 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
1dfa0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
1dfb0 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
1dfc0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
1dfd0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
1dfe0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1dff0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
1e000 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e010 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
1e020 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
1e030 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
1e040 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
1e050 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1e060 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
1e070 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
1e080 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
1e090 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
1e0a0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
1e0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1e0c0 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
1e0d0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
1e0e0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
1e0f0 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
1e100 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
1e110 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
1e120 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1e130 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
1e140 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
1e150 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61  pPg->pData;.  Pa
1e160 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e170 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1e180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e190 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1e1a0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1e1b0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1e1c0 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1e1d0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1e1e0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1e1f0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1e200 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e210 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1e220 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1e230 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1e240 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1e250 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1e260 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1e270 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1e280 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1e290 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1e2a0 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1e2b0 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1e2c0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1e2d0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1e2e0 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1e2f0 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1e300 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1e310 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1e320 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1e330 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1e340 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1e350 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1e360 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1e370 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1e380 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1e390 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1e3a0 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1e3b0 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1e3c0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1e3d0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1e3e0 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1e3f0 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1e400 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1e410 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1e420 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1e430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e440 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1e450 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1e460 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1e470 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1e480 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1e490 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1e4a0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1e4b0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
1e4c0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1e4d0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
1e4e0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
1e4f0 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
1e500 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1e510 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1e520 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1e530 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
1e540 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
1e550 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
1e560 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
1e570 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1e580 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
1e590 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
1e5a0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
1e5b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
1e5c0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
1e5d0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
1e5e0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
1e5f0 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
1e600 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
1e610 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1e620 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
1e630 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
1e640 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1e650 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1e660 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e670 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1e680 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e690 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
1e6a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1e6b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e6c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e6d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e6e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1e6f0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1e700 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1e710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1e720 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
1e730 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
1e740 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1e750 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1e760 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
1e770 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1e780 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1e790 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1e7a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e7b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e7c0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
1e7d0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1e7e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
1e7f0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
1e800 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1e810 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
1e820 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
1e830 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
1e840 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
1e850 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1e860 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1e870 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
1e880 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1e890 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
1e8a0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1e8b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1e8c0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
1e8d0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
1e8e0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
1e8f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1e900 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  lOpen ){.      i
1e910 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
1e920 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e930 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
1e940 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
1e950 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
1e960 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1e970 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1e980 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1e990 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1e9a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
1e9b0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1e9c0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1e9d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1e9e0 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1e9f0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1ea00 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
1ea10 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
1ea20 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1ea30 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1ea40 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
1ea50 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1ea60 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
1ea70 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
1ea80 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
1ea90 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
1eaa0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1eab0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1eac0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1ead0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d  journalOff, pPg-
1eae0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1eaf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1eb00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1eb10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1eb20 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
1eb30 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1eb40 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1eb70 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b  journalOff + 4);
1eb80 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1eb90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1eba0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ebb0 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e+4;.        }. 
1ebc0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1ebd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ebe0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1ebf0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1ec00 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
1ec10 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
1ec20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1ec30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
1ec40 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
1ec50 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1ec60 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
1ec70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1ec80 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
1ec90 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1eca0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1ecb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1ecc0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1ecd0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1ece0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
1ecf0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1ed00 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
1ed10 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1ed20 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
1ed30 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1ed40 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1ed50 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1ed70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1ed80 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
1ed90 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1eda0 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
1edb0 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
1edc0 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
1edd0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69  ror occurred whi
1ede0 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
1edf0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
1ee00 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
1ee10 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
1ee20 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
1ee30 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
1ee40 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
1ee50 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
1ee60 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1ee70 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
1ee80 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
1ee90 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1eea0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
1eeb0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
1eec0 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
1eed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
1eee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1eef0 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
1ef00 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1ef10 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
1ef20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
1ef30 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
1ef40 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
1ef50 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1ef60 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1ef70 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
1ef80 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
1ef90 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
1efa0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1efb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1efc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
1efd0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
1efe0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1eff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1f000 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  e .        ** tr
1f010 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1f020 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1f030 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1f040 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f050 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f070 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f080 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f090 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
1f0a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f0b0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1f0c0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
1f0d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f0e0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
1f0f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
1f100 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1f110 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
1f120 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1f130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1f140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1f150 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1f160 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
1f170 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
1f180 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1f190 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1f1a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f1b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f1c0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1f1d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1f1e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f1f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1f200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f210 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1f220 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
1f230 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
1f240 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
1f250 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
1f260 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
1f270 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f280 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1f290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f2a0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
1f2b0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
1f2c0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1f2e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1f2f0 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
1f300 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
1f310 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1f320 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
1f330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f340 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1f350 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1f360 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1f370 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1f380 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1f390 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1f3a0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1f3b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1f3c0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1f3d0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1f3e0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1f3f0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1f400 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1f410 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1f420 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1f430 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1f440 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1f450 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
1f460 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1f470 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
1f480 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
1f490 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1f4a0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1f4b0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f4c0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1f4d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f4e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1f4f0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1f500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
1f510 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1f520 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1f530 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1f540 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1f550 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f 50 47  ze==(PAGER_MJ_PG
1f560 4e 4f 28 70 50 61 67 65 72 29 2d 31 29 20 29 7b  NO(pPager)-1) ){
1f570 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1f580 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
1f590 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f5a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1f5b0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1f5c0 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61  o mark a data-pa
1f5d0 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20  ge as writable. 
1f5e0 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65  It uses .** page
1f5f0 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65  r_write() to ope
1f600 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
1f610 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1f620 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20  lready open).** 
1f630 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61  and write the pa
1f640 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65  ge *pData to the
1f650 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1f660 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1f670 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
1f680 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
1f690 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
1f6a0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1f6b0 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
1f6c0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
1f6d0 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
1f6e0 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
1f6f0 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
1f700 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
1f710 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
1f720 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
1f730 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
1f740 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1f750 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
1f760 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
1f770 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f780 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
1f790 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
1f7a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
1f7b0 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
1f7c0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
1f7d0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1f7e0 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
1f7f0 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
1f800 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
1f810 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f820 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
1f830 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
1f840 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
1f850 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1f860 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1f870 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1f880 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
1f890 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
1f8a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
1f8b0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1f8c0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1f8d0 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
1f8e0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1f8f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f900 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
1f910 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
1f920 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
1f930 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  i;.    int needS
1f940 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
1f950 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
1f960 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
1f970 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
1f980 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
1f990 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
1f9a0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
1f9b0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
1f9c0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
1f9d0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1f9e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1f9f0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
1fa00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1fa10 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1fa20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1fa30 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
1fa40 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
1fa50 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
1fa60 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
1fa70 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
1fa80 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
1fa90 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
1faa0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
1fab0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
1fac0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
1fad0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1fae0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1faf0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1fb00 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
1fb10 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
1fb20 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
1fb30 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
1fb40 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1fb50 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1fb60 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
1fb70 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
1fb80 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
1fb90 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1fba0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
1fbb0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
1fbc0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
1fbd0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
1fbe0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1fbf0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1fc00 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
1fc10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1fc20 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
1fc30 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
1fc40 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
1fc50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
1fc60 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
1fc70 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
1fc80 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
1fc90 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
1fca0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
1fcb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
1fcc0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
1fcd0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
1fce0 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
1fcf0 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
1fd00 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
1fd10 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
1fd20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
1fd30 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
1fd40 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
1fd50 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1fd60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1fd70 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1fd80 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
1fd90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1fda0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fdb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1fdc0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1fdd0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1fde0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
1fdf0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1fe00 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
1fe10 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
1fe20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
1fe30 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1fe40 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
1fe50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fe60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fe70 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1fe80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fe90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1fea0 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
1feb0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1fec0 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
1fed0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1fee0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1fef0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1ff00 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
1ff10 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1ff20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ff30 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
1ff40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ff50 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44    /* If the PGHD
1ff60 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1ff70 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
1ff80 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
1ff90 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
1ffa0 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
1ffb0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1ffc0 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
1ffd0 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
1ffe0 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
1fff0 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
20000 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
20010 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
20020 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
20030 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
20040 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
20050 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
20060 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
20070 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
20080 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
20090 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
200a0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
200b0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b   if( needSync ){
200c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
200d0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
200e0 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
200f0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
20100 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
20110 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
20120 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
20130 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
20140 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
20150 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20160 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
20170 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
20180 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
20190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
201a0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
201b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
201c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
201d0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
201e0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
201f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20200 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
20210 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
20220 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
20230 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
20240 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
20250 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
20260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20270 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
20280 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
20290 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
202a0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
202b0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
202c0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
202d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
202e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
202f0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
20300 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
20310 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
20320 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
20330 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
20340 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
20350 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
20360 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
20370 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
20380 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
20390 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
203a0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
203b0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
203c0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
203d0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
203e0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
203f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
20400 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
20410 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
20420 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
20430 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
20440 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
20450 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
20460 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
20470 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
20480 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
20490 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
204a0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
204b0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
204c0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
204d0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
204e0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
204f0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
20500 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
20510 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
20520 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
20530 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
20540 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
20550 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
20560 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
20570 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
20580 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
20590 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
205a0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
205b0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
205c0 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
205d0 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
205e0 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
205f0 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
20600 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
20610 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
20620 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
20630 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
20640 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
20650 6c 65 64 2c 20 73 65 74 20 74 68 65 20 62 69 74  led, set the bit
20660 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
20670 6f 20 70 44 62 50 61 67 65 20 69 6e 0a 2a 2a 20  o pDbPage in.** 
20680 74 68 65 20 50 61 67 65 72 2e 70 41 6c 77 61 79  the Pager.pAlway
20690 73 52 6f 6c 6c 62 61 63 6b 20 62 69 74 76 65 63  sRollback bitvec
206a0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  .  Subsequent ca
206b0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
206c0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
206d0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
206e0 65 20 70 61 67 65 20 77 69 6c 6c 20 74 68 65 72  e page will ther
206f0 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
20700 64 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 65  d..** This is ne
20710 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
20720 20 61 20 70 72 6f 62 6c 65 6d 20 77 68 65 72 65   a problem where
20730 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
20740 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  a is added to.**
20750 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
20760 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
20770 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
20780 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
20790 20 74 68 65 0a 2a 2a 20 66 72 65 65 6c 69 73 74   the.** freelist
207a0 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
207b0 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65  part of the same
207c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
207d0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
207e0 0a 2a 2a 20 6f 74 68 65 72 20 70 75 72 70 6f 73  .** other purpos
207f0 65 2e 20 20 57 68 65 6e 20 69 74 20 69 73 20 66  e.  When it is f
20800 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
20810 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
20820 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63   routine is.** c
20830 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
20840 73 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33  sed, the sqlite3
20850 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
20860 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
20870 61 6c 6c 65 64 2e 0a 2a 2a 20 42 75 74 20 62 65  alled..** But be
20880 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
20890 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
208a0 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
208b0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
208c0 69 74 0a 2a 2a 20 67 65 74 73 20 72 6f 6c 6c 65  it.** gets rolle
208d0 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
208e0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
208f0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
20900 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ) call..*/.int s
20910 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
20920 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
20930 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
20940 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
20950 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
20960 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
20970 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
20980 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
20990 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
209a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
209b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
209c0 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
209d0 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
209e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
209f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
20a00 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61     pPager->pAlwa
20a10 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ysRollback = sql
20a20 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
20a30 28 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  (pPager->dbOrigS
20a40 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
20a50 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
20a60 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
20a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20a80 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
20a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
20aa0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
20ab0 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  AlwaysRollback, 
20ac0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69  pPg->pgno);..  i
20ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ae0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
20af0 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
20b00 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
20b10 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  nt==0 ){.    ass
20b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20b30 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
20b40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20b50 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d  er->dbSize==pPg-
20b60 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
20b70 3e 64 62 4f 72 69 67 53 69 7a 65 3c 70 50 61 67  >dbOrigSize<pPag
20b80 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
20b90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
20ba0 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
20bb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
20bc0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
20bd0 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
20be0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
20bf0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
20c00 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
20c10 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
20c20 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
20c30 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
20c40 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
20c50 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
20c60 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
20c70 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
20c80 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
20c90 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
20ca0 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
20cb0 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
20cc0 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
20cd0 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
20ce0 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
20cf0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20d00 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
20d10 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
20d20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
20d30 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
20d40 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
20d50 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
20d60 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
20d70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
20d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
20d90 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
20da0 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
20db0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
20dc0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
20dd0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
20de0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
20df0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
20e00 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
20e10 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e  no)).      pPg->
20e20 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
20e30 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
20e40 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
20e50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
20e60 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
20e70 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
20e80 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
20e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ea0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
20eb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
20ec0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
20ed0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
20ee0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
20ef0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
20f00 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
20f10 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
20f20 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
20f30 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
20f40 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
20f50 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
20f60 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
20f70 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
20f80 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
20f90 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
20fa0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
20fb0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
20fc0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
20fd0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
20fe0 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
20ff0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
21000 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
21010 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
21020 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
21030 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
21040 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
21050 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
21060 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
21070 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
21080 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
21090 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
210a0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
210b0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
210c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
210d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 54 45 53 54  ->pPager;.  TEST
210e0 4f 4e 4c 59 28 20 69 6e 74 20 72 63 3b 20 29 20  ONLY( int rc; ) 
210f0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
21100 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 69 74   from sqlite3Bit
21110 76 65 63 53 65 74 28 29 20 2a 2f 0a 0a 20 20 61  vecSet() */..  a
21120 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21130 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
21140 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
21150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21160 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
21170 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
21180 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
21190 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
211a0 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
211b0 73 20 74 68 65 20 50 61 67 65 72 2e 70 41 6c 77  s the Pager.pAlw
211c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 62 69 74 29  aysRollback bit)
211d0 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a  , then this.  **
211e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
211f0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
21200 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21210 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Open==0 .   || s
21220 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
21230 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
21240 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
21250 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e  gno).   || pPg->
21260 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
21270 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20  rigSize.  ){.   
21280 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69   return;.  }..#i
21290 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
212a0 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20  RE_DELETE.  if( 
212b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
212c0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
212d0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
212e0 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70  !=0.   || pPg->p
212f0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
21300 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  igSize ){.    re
21310 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
21320 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45  ..  /* If SECURE
21330 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61 62  _DELETE is disab
21340 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20  led, then there 
21350 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
21360 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  his.  ** routine
21370 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f   can be called o
21380 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68 69  n a page for whi
21390 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ch sqlite3PagerD
213a0 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20  ontWrite().  ** 
213b0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
213c0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64  viously called d
213d0 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74  uring the same t
213e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
213f0 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74   And if DontWrit
21400 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75 73  e() has previous
21410 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  ly been called, 
21420 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
21430 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  ** conditions mu
21440 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a  st be met..  **.
21450 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e    ** (Later:)  N
21460 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68 65  ot true.  If the
21470 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
21480 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e 67  rupted by having
21490 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20   duplicate.  ** 
214a0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
214b0 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75  elist (ex: corru
214c0 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74  pt9.test) then t
214d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
214e0 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
214f0 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a  rily true:.  */.
21500 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
21510 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
21520 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
21530 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
21540 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73  Size ); */..  as
21550 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
21560 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
21570 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
21580 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
21590 0a 0a 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74  ..  /* Failure t
215a0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
215b0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
215c0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
215d0 65 6e 69 67 6e 2e 0a 20 20 2a 2a 20 49 74 20 6d  enign..  ** It m
215e0 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
215f0 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
21600 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
21610 6a 6f 75 72 6e 61 6c 20 61 20 70 61 67 65 0a 20  journal a page. 
21620 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
21630 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
21640 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
21650 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 74  eless, be sure t
21660 6f 20 74 65 73 74 20 74 68 65 0a 20 20 2a 2a 20  o test the.  ** 
21670 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
21680 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
21690 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
216a0 20 73 65 74 20 61 20 62 69 74 20 69 6e 20 61 20   set a bit in a 
216b0 0a 20 20 2a 2a 20 62 69 74 20 76 65 63 74 6f 72  .  ** bit vector
216c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
216d0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
216e0 63 28 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  c();.  TESTONLY(
216f0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
21700 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
21710 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
21720 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63  ->pgno);.  testc
21730 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
21740 4e 4f 4d 45 4d 20 29 3b 0a 20 20 54 45 53 54 4f  NOMEM );.  TESTO
21750 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
21760 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
21770 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
21780 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
21790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
217a0 45 4d 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  EM );.  sqlite3E
217b0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
217c0 3b 0a 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  ;...  PAGERTRACE
217d0 28 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  (("DONT_ROLLBACK
217e0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
217f0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
21800 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
21810 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52  .  IOTRACE(("GAR
21820 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  BAGE %p %d\n", p
21830 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21840 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )).}.../*.** Thi
21850 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21860 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
21870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21880 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
21890 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
218a0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
218b0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
218c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
218d0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
218e0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
218f0 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
21900 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
21910 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
21920 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
21930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
21940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
21950 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
21960 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
21970 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73  ect==0 );  /* is
21980 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20 74  Direct is only t
21990 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20 77  rue for atomic w
219a0 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  rites */.#endif.
219b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
219c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
219d0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
219e0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  >0 ){.    /* Ope
219f0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
21a00 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
21a10 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
21a20 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
21a30 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
21a40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21a50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21a60 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21  n rc;..    if( !
21a70 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
21a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21a90 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
21aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ac0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
21ad0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
21ae0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
21af0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
21b00 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
21b10 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
21b20 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
21b30 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
21b40 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
21b50 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
21b60 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
21b70 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
21b80 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67  Vers);.    chang
21b90 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
21ba0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
21bb0 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61  r*)pPgHdr->pData
21bc0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
21bd0 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53  nter);..#ifdef S
21be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
21bf0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66  MIC_WRITE.    if
21c00 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
21c10 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
21c20 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
21c30 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70  t void *zBuf = p
21c40 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20  PgHdr->pData;.  
21c50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21c60 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30  er->dbFileSize>0
21c70 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
21c80 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
21c90 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
21ca0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21cb0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
21cc0 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  if..    /* Relea
21cd0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
21ce0 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
21cf0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21d00 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61  pPgHdr);.    pPa
21d10 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
21d20 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Done = 1;.  }.  
21d30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21d40 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
21d50 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
21d60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21d70 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
21d80 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
21d90 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  c;.  if( MEMDB )
21da0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21db0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
21dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21dd0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
21de0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
21df0 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lags);.  }.  ret
21e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21e10 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
21e20 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
21e30 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
21e40 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
21e50 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
21e60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21e70 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
21e80 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
21e90 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
21ea0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
21eb0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
21ec0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
21ed0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
21ee0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
21ef0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
21f00 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
21f10 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
21f20 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
21f30 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
21f40 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
21f50 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
21f60 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
21f70 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
21f80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21f90 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
21fa0 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
21fb0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
21fc0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
21fd0 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
21fe0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21ff0 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
22000 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
22010 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
22020 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
22030 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
22040 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
22050 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
22060 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
22070 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
22080 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
22090 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
220a0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
220b0 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
220c0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
220d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
220e0 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
220f0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
22100 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
22110 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
22120 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
22130 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
22140 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
22150 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
22160 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
22170 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
22180 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
22190 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
221a0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
221b0 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
221c0 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  Pager, .  const 
221d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a  char *zMaster, .
221e0 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
221f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22200 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
22210 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
22220 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
22230 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
22240 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e  .  /* If no chan
22250 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
22260 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65  de, we can leave
22270 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22280 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69   early..  */.  i
22290 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
222a0 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
222b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
222c0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
222d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
222e0 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
222f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22300 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
22310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22320 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
22330 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
22340 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
22350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22360 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
22370 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
22380 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
22390 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
223a0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
223b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
223c0 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
223d0 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20  dbSize));..  /* 
223e0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
223f0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
22400 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
22410 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
22420 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
22430 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
22440 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
22450 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
22460 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
22470 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
22480 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
22490 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
224a0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
224b0 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51  *pPg;..#ifdef SQ
224c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
224d0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20  IC_WRITE.    /* 
224e0 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  The atomic-write
224f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
22500 6e 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  n be used if all
22510 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
22520 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22530 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
22540 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73      + The file-s
22550 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
22560 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
22570 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
22580 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
22590 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
225a0 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
225b0 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   + This commit i
225c0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
225d0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
225e0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
225f0 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20  **    + Exactly 
22600 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
22610 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
22620 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
22630 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
22640 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
22650 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
22660 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68  be used, then th
22670 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
22680 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a  ill never.    **
22690 20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72 20   be created for 
226a0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
226b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
226c0 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 3b   useAtomicWrite;
226d0 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
226e0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
226f0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22700 65 29 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d 69  e);.    useAtomi
22710 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20  cWrite = (.     
22720 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a     !zMaster && .
22730 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22740 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20  journalOpen &&. 
22750 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
22760 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
22770 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
22780 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  ) && .        pP
22790 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
227a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
227b0 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70 50   && .        (pP
227c0 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44 69  g==0 || pPg->pDi
227d0 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a 20  rty==0).    );. 
227e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
227f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
22800 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
22810 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
22820 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
22830 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69      if( useAtomi
22840 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  cWrite ){.      
22850 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52  /* Update the nR
22860 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
22870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
22880 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65  .      int offse
22890 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
228a0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
228b0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
228c0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
228d0 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20  ger->nRec==1);. 
228e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
228f0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
22900 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65  d, offset, pPage
22910 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
22920 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
22930 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
22940 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  unter. The follo
22950 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
22960 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74  odify.      ** t
22970 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
22980 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
22990 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65  age 1 to include
229a0 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20   the updated.   
229b0 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75     ** change cou
229c0 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
229d0 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63  ite page 1 direc
229e0 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
229f0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
22a00 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
22a10 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
22a20 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
22a30 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
22a40 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
22a50 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a  is safe..      *
22a60 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
22a70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22a80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22a90 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
22aa0 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
22ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22ac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22ad0 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
22ae0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
22af0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
22b00 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26  useAtomicWrite &
22b10 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
22b20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ).#endif..    /*
22b30 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
22b40 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
22b50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22b60 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
22b70 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
22b80 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
22b90 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
22ba0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
22bb0 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
22bc0 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
22bd0 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
22be0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
22bf0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
22c00 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
22c10 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
22c20 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
22c30 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
22c40 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
22c50 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
22c60 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
22c70 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
22c80 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
22c90 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
22ca0 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
22cb0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
22cc0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
22cd0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
22ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22cf0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
22d00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
22d10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
22d20 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
22d30 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65  DE_OFF ){.#ifnde
22d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
22d50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
22d60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
22d70 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
22d80 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
22d90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
22da0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
22db0 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
22dc0 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
22dd0 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
22de0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
22df0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
22e00 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
22e10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
22e20 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
22e30 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
22e40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22e50 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
22e60 20 20 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20     Pgno iSkip = 
22e70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
22e80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
22e90 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
22ea0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
22eb0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
22ec0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
22ed0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
22ee0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64          for( i=d
22ef0 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
22f00 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
22f10 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
22f20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
22f30 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
22f40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
22f50 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
22f70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
22f80 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
22f90 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
22fa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22fb0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
22fc0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
22fd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22fe0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
22ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23000 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
23010 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
23020 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23030 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
23040 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
23050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23060 20 20 7d 20 0a 20 20 20 20 20 20 20 20 20 20 70    } .          p
23070 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
23080 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  dbSize;.        
23090 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
230a0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
230b0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
230c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
230d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
230e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
230f0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72  _exit;.        r
23100 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
23110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
23120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
23140 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
23150 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
23160 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
23170 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23180 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 73  e */.    pPg = s
23190 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
231a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
231b0 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d  Cache);.    rc =
231c0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
231d0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
231e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
231f0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
23200 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
23210 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
23220 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
23230 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
23240 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
23250 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
23260 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
23270 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
23280 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
23290 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
232a0 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
232b0 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
232c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
232d0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
232e0 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
232f0 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
23300 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
23310 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
23320 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
23330 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
23340 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
23350 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
23360 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
23370 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
23380 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
23390 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
233a0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
233b0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
233c0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
233d0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
233e0 61 63 68 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  ache);..    if( 
233f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
23400 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
23410 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
23420 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
23430 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
23440 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
23450 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
23460 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  Pager, pPager->d
23470 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  bSize);.      if
23480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23490 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
234a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
234b0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
234c0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
234d0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
234e0 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
234f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23500 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
23510 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
23520 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
23530 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
23540 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
23550 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
23560 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
23570 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79  _SYNCED;.  }..sy
23580 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
23590 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
235a0 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
235b0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
235c0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
235d0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
235e0 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
235f0 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
23600 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
23610 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
23620 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
23630 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
23640 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
23650 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
23660 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
23670 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
23680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
23690 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
236a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
236b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
236c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
236d0 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
236e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
236f0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
23700 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
23710 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
23720 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
23730 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
23740 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
23750 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
23760 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
23770 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
23780 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
23790 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
237a0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
237b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
237c0 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
237d0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
237e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
237f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
23800 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
23810 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
23830 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
23840 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
23850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23860 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
23870 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
23880 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
23890 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
238a0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
238b0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
238c0 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
238d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
238e0 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
238f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
23900 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
23910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
23920 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
23930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23940 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  }.  PAGERTRACE((
23950 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
23960 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
23970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
23980 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23990 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42  _SYNCED || MEMDB
239a0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
239b0 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
239c0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
239d0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
239e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
239f0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
23a00 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
23a10 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
23a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
23a30 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
23a40 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
23a50 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
23a60 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
23a70 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
23a80 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
23a90 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
23aa0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
23ab0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
23ac0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
23ad0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23ae0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
23af0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
23b00 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
23b10 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
23b20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
23b30 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
23b40 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
23b50 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
23b60 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
23b70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23b80 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
23b90 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
23ba0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
23bb0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
23bc0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
23bd0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
23be0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
23bf0 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
23c00 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
23c10 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
23c20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
23c30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23c40 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
23c50 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
23c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23c70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52    PAGERTRACE(("R
23c80 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
23c90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
23ca0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
23cb0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
23cc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23cd0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
23ce0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
23cf0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
23d00 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
23d10 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
23d20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
23d30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23d40 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
23d50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23d60 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
23d70 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
23d80 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
23d90 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
23da0 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
23db0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
23dc0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
23dd0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
23de0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
23df0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
23e00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
23e10 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
23e20 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
23e30 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
23e40 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
23e50 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
23e60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23e80 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
23e90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
23ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
23eb0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
23ec0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
23ed0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
23ee0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
23ef0 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
23f00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
23f10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
23f20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
23f30 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
23f40 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
23f50 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
23f60 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
23f70 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
23f80 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
23f90 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
23fa0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
23fb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
23fc0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
23fd0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
23fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23ff0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24010 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
24020 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
24030 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
24040 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
24050 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
24060 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
24070 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
24080 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
24090 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
240a0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
240b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
240c0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
240d0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
240e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
240f0 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
24100 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
24110 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
24120 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
24130 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
24140 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24150 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
24160 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
24170 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
24180 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
24190 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
241a0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
241b0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
241c0 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
241d0 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
241e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
241f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24200 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
24210 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
24220 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
24230 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
24240 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24250 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
24260 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
24270 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
24280 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
24290 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
242a0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
242b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
242c0 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
242d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
242e0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
242f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
24300 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
24310 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74  SizeValid ? (int
24320 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ) pPager->dbSize
24330 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20   : -1;.  a[4] = 
24340 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
24350 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
24360 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
24370 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
24380 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
24390 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
243a0 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
243b0 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
243c0 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
243d0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
243e0 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
243f0 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
24400 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  ;.}.int sqlite3P
24410 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
24420 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
24430 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65  turn MEMDB;.}.#e
24440 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  ndif../*.** Ensu
24450 72 65 20 74 68 61 74 20 74 68 65 72 65 20 61 72  re that there ar
24460 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65  e at least nSave
24470 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73  point savepoints
24480 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
24490 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
244a0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
244b0 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
244c0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
244d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
244e0 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e   if( nSavepoint>
244f0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
24500 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  nt && pPager->us
24510 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
24520 69 6e 74 20 69 69 3b 0a 20 20 20 20 50 61 67 65  int ii;.    Page
24530 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
24540 3b 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ;..    /* Either
24550 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
24560 20 69 73 20 6f 70 65 6e 20 6f 72 20 74 68 65 72   is open or ther
24570 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
24580 73 61 76 65 70 6f 69 6e 74 73 2e 20 2a 2f 0a 20  savepoints. */. 
24590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
245a0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
245b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64   || pPager->sjfd
245c0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 0a 20  ->pMethods );.. 
245d0 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50     /* Grow the P
245e0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
245f0 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c  array using real
24600 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51  loc(). Return SQ
24610 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a  LITE_NOMEM.    *
24620 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  * if the allocat
24630 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72  ion fails. Other
24640 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e  wise, zero the n
24650 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61  ew portion in ca
24660 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c  se a .    ** mal
24670 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
24680 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74  rs while populat
24690 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f  ing it in the fo
246a0 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f  r(...) loop belo
246b0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e  w..    */.    aN
246c0 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70  ew = (PagerSavep
246d0 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65  oint *)sqlite3Re
246e0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
246f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
24700 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53  t, sizeof(PagerS
24710 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70  avepoint)*nSavep
24720 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  oint.    );.    
24730 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20  if( !aNew ){.   
24740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24750 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
24760 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
24770 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
24780 74 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 28  t], 0,.        (
24790 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 70 50 61  nSavepoint - pPa
247a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  ger->nSavepoint)
247b0 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53   * sizeof(PagerS
247c0 61 76 65 70 6f 69 6e 74 29 0a 20 20 20 20 29 3b  avepoint).    );
247d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61  .    pPager->aSa
247e0 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a  vepoint = aNew;.
247f0 20 20 20 20 69 69 20 3d 20 70 50 61 67 65 72 2d      ii = pPager-
24800 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >nSavepoint;.   
24810 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
24820 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74  int = nSavepoint
24830 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  ;..    /* Popula
24840 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76 65  te the PagerSave
24850 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
24860 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e   just allocated.
24870 20 2a 2f 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e   */.    for(/* n
24880 6f 2d 6f 70 20 2a 2f 3b 20 69 69 3c 6e 53 61 76  o-op */; ii<nSav
24890 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
248a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
248b0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
248c0 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69   );.      aNew[i
248d0 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65  i].nOrig = pPage
248e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
248f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
24900 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
24910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
24920 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77   ){.        aNew
24930 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70  [ii].iOffset = p
24940 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
24950 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  f;.      }else{.
24960 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
24970 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e  .iOffset = JOURN
24980 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
24990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
249a0 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65   aNew[ii].iSubRe
249b0 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
249c0 4e 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77  NRec;.      aNew
249d0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
249e0 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
249f0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
24a00 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  dbSize);.      i
24a10 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e  f( !aNew[ii].pIn
24a20 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
24a30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24a40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
24a50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24a60 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
24a70 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e  rnal, if it is n
24a80 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  ot already opene
24a90 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  d. */.    rc = o
24aa0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
24ab0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
24ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24ad0 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69  * Parameter op i
24ae0 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
24af0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
24b00 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  CK or SAVEPOINT_
24b10 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69  RELEASE..** If i
24b20 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
24b30 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c  ELEASE, then rel
24b40 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79  ease and destroy
24b50 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
24b60 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61  ith.** index iSa
24b70 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69  vepoint. If it i
24b80 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
24b90 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62  BACK, then rollb
24ba0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a  ack all changes.
24bb0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ** that have occ
24bc0 75 72 65 64 20 73 69 6e 63 65 20 73 61 76 65 70  ured since savep
24bd0 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20  oint iSavepoint 
24be0 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a  was created..**.
24bf0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
24c00 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  e, all savepoint
24c10 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  s with an index 
24c20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53 61  greater than iSa
24c30 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20  vepoint .** are 
24c40 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
24c50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   If there are le
24c60 73 73 20 74 68 61 6e 20 28 69 53 61 76 65 70 6f  ss than (iSavepo
24c70 69 6e 74 2b 31 29 20 61 63 74 69 76 65 20 73 61  int+1) active sa
24c80 76 65 70 6f 69 6e 74 73 20 77 68 65 6e 20 74 68  vepoints when th
24c90 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
24ca0 69 73 20 63 61 6c 6c 65 64 20 69 74 20 69 73 20  is called it is 
24cb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69 6e 74  a no-op..*/ .int
24cc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
24cd0 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
24ce0 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  ager, int op, in
24cf0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
24d00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24d10 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
24d20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
24d30 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
24d40 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
24d50 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70  );..  if( iSavep
24d60 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61  oint<pPager->nSa
24d70 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
24d80 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
24d90 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
24da0 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   + (op==SAVEPOIN
24db0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
24dc0 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69   for(ii=nNew; ii
24dd0 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
24de0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
24df0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
24e00 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
24e10 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
24e20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
24e30 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
24e40 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77  Savepoint = nNew
24e50 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  ;..    if( op==S
24e60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
24e70 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 66 64  K && pPager->jfd
24e80 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
24e90 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
24ea0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d  nt *pSavepoint =
24eb0 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50   (nNew==0)?0:&pP
24ec0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
24ed0 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20  [nNew-1];.      
24ee0 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61  rc = pagerPlayba
24ef0 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  ckSavepoint(pPag
24f00 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b  er, pSavepoint);
24f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63  .      assert(rc
24f20 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a  !=SQLITE_DONE);.
24f30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
24f40 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
24f50 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
24f60 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
24f70 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
24f80 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
24f90 6c 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e  l. */.    if( nN
24fa0 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56  ew==0 && op==SAV
24fb0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26  EPOINT_RELEASE &
24fc0 26 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e  & pPager->sjfd->
24fd0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
24fe0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
24ff0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
25000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
25010 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
25020 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  sjfd, 0);.      
25030 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
25040 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
25050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25060 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25070 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
25080 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
25090 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
250a0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
250b0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
250c0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
250d0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
250e0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
250f0 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
25100 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
25110 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
25120 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
25130 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
25140 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
25150 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
25160 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
25170 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
25180 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
25190 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
251a0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
251b0 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
251c0 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
251d0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
251e0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
251f0 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
25200 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
25210 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
25220 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
25230 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
25240 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25250 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
25260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25270 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
25280 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
25290 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
252a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
252b0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
252c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
252d0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
252e0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
252f0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
25300 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
25310 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
25320 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25330 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
25340 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
25350 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
25360 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
25370 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
25380 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
25390 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
253a0 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
253b0 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
253c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
253d0 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
253e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
253f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
25400 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
25410 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
25420 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
25430 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
25440 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
25450 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
25460 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
25470 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
25480 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
25490 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
254a0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
254b0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
254c0 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
254d0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
254e0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
254f0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
25500 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25510 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
25520 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
25530 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
25540 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
25550 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
25560 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
25570 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
25580 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
25590 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
255a0 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
255b0 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
255c0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
255d0 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
255e0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
255f0 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
25600 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
25610 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
25620 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
25630 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
25640 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
25650 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
25660 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
25670 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
25680 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
25690 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
256a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
256b0 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
256c0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
256d0 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
256e0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
256f0 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
25700 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
25710 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
25720 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
25730 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
25740 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
25750 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
25760 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
25770 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
25780 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
25790 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
257a0 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
257b0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
257c0 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
257d0 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
257e0 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
257f0 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
25800 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
25810 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
25820 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
25830 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
25840 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
25850 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
25860 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
25870 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
25880 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
25890 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
258a0 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
258b0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
258c0 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
258d0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
258e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
258f0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
25900 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
25910 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
25920 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
25930 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
25940 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
25950 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25960 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
25970 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
25980 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
25990 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
259a0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
259b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
259c0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
259d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   */.  Pgno needS
259e0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 20 20 69  yncPgno = 0;.  i
259f0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
25a00 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
25a10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
25a20 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69  ge being moved i
25a30 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20  s dirty and has 
25a40 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62  not been saved b
25a50 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a  y the latest.  *
25a60 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  * savepoint, the
25a70 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  n save the curre
25a80 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
25a90 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
25aa0 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e   .  ** sub-journ
25ab0 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  al now. This is 
25ac0 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
25ad0 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  le the following
25ae0 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a   scenario:.  **.
25af0 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
25b00 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
25b10 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64  page X, then mod
25b20 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79  ify it in memory
25b30 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50  >.  **     SAVEP
25b40 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20  OINT one;.  **  
25b50 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20       <Move page 
25b60 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e  X to location Y>
25b70 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
25b80 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a  CK TO one;.  **.
25b90 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77    ** If page X w
25ba0 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  ere not written 
25bb0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
25bc0 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c  al here, it woul
25bd0 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f  d not.  ** be po
25be0 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72  ssible to restor
25bf0 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77  e its contents w
25c00 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
25c10 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73  K TO one".  ** s
25c20 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 70 72  tatement were pr
25c30 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
25c40 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
25c50 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26  GHDR_DIRTY .   &
25c60 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
25c70 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
25c80 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
25c90 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
25ca0 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
25cb0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
25cc0 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
25cd0 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
25ce0 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
25cf0 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
25d00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
25d10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
25d20 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
25d30 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
25d40 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
25d50 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
25d60 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
25d70 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
25d80 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74    pager_get_cont
25d90 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  ent(pPg);..  /* 
25da0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  If the journal n
25db0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
25dc0 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20  )ed before page 
25dd0 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20  pPg->pgno can.  
25de0 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
25df0 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  , store pPg->pgn
25e00 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  o in local varia
25e10 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  ble needSyncPgno
25e20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
25e30 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
25e40 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69   is set, there i
25e50 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
25e60 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20  ember that.  ** 
25e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
25e80 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
25e90 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
25ea0 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
25eb0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  .  ** can be wri
25ec0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
25ed0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
25ee0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
25ef0 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a  write to it..  *
25f00 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  /.  if( (pPg->fl
25f10 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
25f20 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69  YNC) && !isCommi
25f30 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  t ){.    needSyn
25f40 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
25f50 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
25f60 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
25f70 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
25f80 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
25f90 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
25fa0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
25fb0 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61  R_DIRTY );.    a
25fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
25fd0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
25fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
25ff0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
26000 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
26010 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
26020 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73  it.  ** from its
26030 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
26040 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
26050 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
26060 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
26070 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
26080 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
26090 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
260a0 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
260b0 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
260c0 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
260d0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
260e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
260f0 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
26100 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
26110 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
26120 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67  ( !pPgOld || pPg
26130 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  Old->nRef==1 );.
26140 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
26150 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
26160 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73  = (pPgOld->flags
26170 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
26180 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
26190 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
261a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
261b0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  gOld ){.    sqli
261c0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
261d0 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  gOld);.  }..  sq
261e0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
261f0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
26200 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
26210 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 1;.  pPager->d
26220 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
26230 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
26240 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
26250 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
26260 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
26270 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26280 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
26290 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
262a0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
262b0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
262c0 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
262d0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
262e0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
262f0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
26300 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
26310 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
26320 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
26330 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
26340 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
26350 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
26360 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
26370 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
26380 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
26390 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
263a0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
263b0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
263c0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
263d0 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
263e0 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
263f0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
26400 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
26410 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
26420 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
26430 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
26440 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
26450 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
26460 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
26470 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
26480 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
26490 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
264a0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
264b0 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
264c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
264d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
264e0 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
264f0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
26500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
26510 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
26520 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
26530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26540 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
26550 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
26560 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
26570 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
26580 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
26590 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
265a0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
265b0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
265c0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
265d0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
265e0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50  oo..    */.    P
265f0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
26600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26610 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
26620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26630 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
26640 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
26650 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
26660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26670 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
26680 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->pInJournal && 
26690 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
266a0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
266b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
266c0 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
266d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
266e0 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29  l, needSyncPgno)
266f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26710 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
26720 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61  dSync = 1;.    a
26730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
26740 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d  oSync==0 && !MEM
26750 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72  DB );.    pPgHdr
26760 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
26770 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
26780 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
26790 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
267a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
267b0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
267c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
267d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
267e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
267f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26800 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
26810 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
26820 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
26830 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
26840 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
26850 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
26860 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
26870 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
26880 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
26890 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
268a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
268b0 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
268c0 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
268d0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
268e0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
268f0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
26900 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
26910 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
26920 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
26930 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
26940 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
26950 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70  n (pPager?pPg->p
26960 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Extra:0);.}../*.
26970 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
26980 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
26990 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
269a0 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
269b0 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
269c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
269d0 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
269e0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
269f0 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
26a00 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
26a10 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
26a20 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
26a30 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
26a40 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
26a50 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
26a60 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
26a70 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
26a80 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
26a90 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
26aa0 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
26ab0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
26ac0 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
26ad0 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
26ae0 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
26af0 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
26b00 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
26b10 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
26b20 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
26b30 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
26b40 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
26b50 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
26b60 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
26b70 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
26b80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
26b90 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
26ba0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
26bb0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
26bc0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
26bd0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
26be0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
26bf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
26c00 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
26c10 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
26c20 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
26c30 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
26c40 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
26c50 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
26c60 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
26c70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
26c80 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
26c90 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
26ca0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
26cb0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
26cc0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
26cd0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
26ce0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
26cf0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
26d00 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
26d10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26d20 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
26d30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26d40 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
26d50 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26d60 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
26d70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26d80 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
26d90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26da0 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OFF.**.** If th
26db0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
26dc0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
26dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
26de0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
26df0 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
26e00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
26e10 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
26e20 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
26e30 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
26e40 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a   journal-mode..*
26e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26e60 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  erJournalMode(Pa
26e70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
26e80 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 21   eMode){.  if( !
26e90 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
26ea0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
26eb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
26ec0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
26ed0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
26ee0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
26ef0 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  LETE.           
26f00 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
26f10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
26f20 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20  RUNCATE.        
26f30 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
26f40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26f50 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
26f60 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
26f70 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
26f80 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
26f90 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
26fa0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26fb0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
26fc0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
26fd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
26fe0 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  <0 );.    if( eM
26ff0 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode>=0 ){.      
27000 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27010 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
27020 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27030 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
27040 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
27050 44 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 20 20  DE_QUERY );.    
27060 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  }.  }.  return (
27070 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
27080 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
27090 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
270a0 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
270b0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
270c0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
270d0 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  64 sqlite3PagerJ
270e0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28  ournalSizeLimit(
270f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
27100 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66  64 iLimit){.  if
27110 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a  ( iLimit>=-1 ){.
27120 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
27130 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69  nalSizeLimit = i
27140 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
27150 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  urn pPager->jour
27160 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a  nalSizeLimit;.}.
27170 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27180 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
27190 0a                                               .