/ Hex Artifact Content
Login

Artifact 1c41ddee47a9f6c5e3431faac071ef705fb736f9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 38  : pager.c,v 1.58
0350: 33 20 32 30 30 39 2f 30 34 2f 32 38 20 30 35 3a  3 2009/04/28 05:
0360: 32 37 3a 32 30 20 64 61 6e 69 65 6c 6b 31 39 37  27:20 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 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1120: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1130: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1140: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1150: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1160: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1170: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
1190: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
11a0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
11b0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
11c0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
11e0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
11f0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
1200: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
1210: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
1220: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
1230: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
1240: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
1250: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1260: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
1270: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
1280: 20 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53   16MB. If the xS
1290: 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68  ectorsize() meth
12a0: 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  od .** returns a
12b0: 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68   value larger th
12c0: 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41  an this, then MA
12d0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73  X_SECTOR_SIZE is
12e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
12f0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e  * This could con
1300: 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63  ceivably cause c
1310: 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77  orruption follow
1320: 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ing a power fail
1330: 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61  ure on.** such a
1340: 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73   system. This is
1350: 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e   currently an un
1360: 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74  documented limit
1370: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1380: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30  _SECTOR_SIZE 0x0
1390: 31 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  100000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2f 0a 73 74 72 75  ournal"..*/.stru
27f0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
2800: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
2810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
2820: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
2830: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
2840: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
2850: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2860: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
2870: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
2880: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
2890: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
28a0: 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68       /* On of th
28b0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
28c0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
28d0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
2900: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
2910: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
2920: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
2930: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2940: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2950: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
2960: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
2970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2980: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
2990: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
29a0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
29d0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
29e0: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
29f0: 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61  */.  u8 sync_fla
2a00: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2a10: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f   /* One of SYNC_
2a20: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
2a30: 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ULL */.  u8 temp
2a40: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
2a50: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2a60: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
2a70: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
2a80: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
2a90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2aa0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2ab0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2ac0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ae0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2af0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
2b00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2b10: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
2b20: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
2b30: 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61  rs that are dyna
2b40: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64  mically.  ** mod
2b50: 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72  ified during nor
2b60: 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  mal operations. 
2b70: 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62  The other variab
2b80: 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75  les in this stru
2b90: 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65  cture.  ** are e
2ba0: 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  ither constant t
2bb0: 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69  hroughout the li
2bc0: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61  fetime of the pa
2bd0: 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ger, or else.  *
2be0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
2bf0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61  configuration pa
2c00: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66  rameters that af
2c10: 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65  fect the way the
2c20: 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65   pager .  ** ope
2c30: 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rates..  **.  **
2c40: 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72   The 'state' var
2c50: 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62  iable is describ
2c60: 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69  ed in more detai
2c70: 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  l along with the
2c80: 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f  .  ** descriptio
2c90: 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  ns of the values
2ca0: 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50   it may take - P
2cb0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e  AGER_UNLOCK etc.
2cc0: 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a   Many of the.  *
2cd0: 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  * other variable
2ce0: 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20  s in this block 
2cf0: 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e  are described in
2d00: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72   the comment dir
2d10: 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76  ectly .  ** abov
2d20: 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66  e this class def
2d30: 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  inition..  */.  
2d40: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d60: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
2d70: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
2d80: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62   etc. */.  u8 db
2d90: 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20  Modified;       
2da0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2db0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2dc0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44  changes to the D
2dd0: 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  b */.  u8 needSy
2de0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2df0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2e00: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2e10: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2e20: 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  l */.  u8 journa
2e30: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
2e40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65     /* True if he
2e50: 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ader of journal 
2e60: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
2e70: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
2e80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
2e90: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
2ea0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
2eb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
2ec0: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ee0: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2ef0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2f00: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
2f10: 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20  doNotSync;      
2f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
2f30: 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c  ean. While true,
2f40: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   do not spill th
2f50: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20  e cache */.  u8 
2f60: 64 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20  dbSizeValid;    
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2f80: 77 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63  when dbSize is c
2f90: 6f 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  orrect */.  Pgno
2fa0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2fc0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2fd0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2fe0: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
3000: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
3010: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
3020: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
3030: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
3040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3050: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3060: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3070: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
30a0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
30b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
30e0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
30f0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
3100: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
3110: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
3120: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
3130: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
3140: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
3150: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
3160: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3170: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
3180: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
3190: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
31a0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
31b0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
31c0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
31d0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
31e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3200: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
3210: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3220: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
3230: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3240: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
3250: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
3260: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
3270: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
3280: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
3290: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
32a0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
32b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
32c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
32e0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
32f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
3300: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
3310: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
3320: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
3330: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
3340: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
3350: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
3360: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
3370: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
3380: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
3390: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
33a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
33b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
33c0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
33d0: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
33e0: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
33f0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
3400: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
3410: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
3420: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
3430: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3440: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
3450: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
3460: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e  ollback */..  in
3470: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
3490: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
34a0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
34b0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ry page */.  u32
34c0: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
34d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
34e0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
34f0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
3500: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
3510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3520: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3530: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e   a page */.  Pgn
3540: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
3550: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
3560: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
3570: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3580: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
3590: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
35a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
35d0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
35e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
35f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
3600: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
3610: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
3620: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
3630: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
3640: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
3650: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
3660: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
3670: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
3680: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3690: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
36a0: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
36b0: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
36c0: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
36d0: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
36e0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
36f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
3700: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
3710: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
3720: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
3730: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
3740: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3750: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
3760: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3770: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
3780: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
3790: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
37a0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
37b0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
37c0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
37d0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
37e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
37f0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
3800: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
3810: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3830: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3840: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3850: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3860: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3870: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3880: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3890: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
38a0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
38b0: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
38c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
38d0: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
38e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
38f0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3900: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3910: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3920: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3930: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3950: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3960: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3970: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3980: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3990: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
39a0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
39b0: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
39c0: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
39d0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
39e0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
39f0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3a00: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3a10: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3a30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3a40: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3a50: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a60: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3a70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3a80: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3a90: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3aa0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3ab0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3ac0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3ad0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ae0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3af0: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3b00: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3b10: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3b20: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3b30: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3b40: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3b50: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3b60: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3b70: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3b80: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3b90: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3ba0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3bb0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3bc0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3bd0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3be0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3bf0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3c00: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3c10: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3c20: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3c30: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3c40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3c50: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3c60: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3c70: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3c80: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3c90: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ca0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3cb0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3cc0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3cd0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3ce0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3cf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3d00: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3d10: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3d20: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3d30: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3d40: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3d50: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3d60: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3d70: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3d80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3d90: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3da0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3db0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3dc0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3dd0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3de0: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
3df0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
3e00: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
3e10: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
3e20: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
3e30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
3e40: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3e50: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3e60: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3e70: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3e80: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3e90: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3ea0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3eb0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3ec0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3ed0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3ee0: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3ef0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3f00: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3f10: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3f20: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3f30: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3f40: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3f50: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3f60: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3f70: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3f80: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3f90: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3fa0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3fb0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3fc0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3fd0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3fe0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3ff0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4000: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4010: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4020: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4030: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4040: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
4050: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
4060: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
4070: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
4080: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
4090: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
40a0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
40b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
40c0: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
40d0: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
40e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
40f0: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4100: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4110: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4120: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4130: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4140: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
4150: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
4160: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
4170: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
4180: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
4190: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
41a0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
41b0: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
41c0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
41d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
41e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
41f0: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4200: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4210: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4220: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4230: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4240: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
4250: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
4260: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
4270: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
4280: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
4290: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
42a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
42b0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
42c0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
42d0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
42e0: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
42f0: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4300: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4310: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4320: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4330: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4340: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
4350: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
4360: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4370: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
4380: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
4390: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
43a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
43b0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
43c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
43d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
43e0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
43f0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4400: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4410: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4420: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4430: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4440: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
4450: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
4460: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
4470: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
4480: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
4490: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
44a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
44b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
44c0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
44d0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
44e0: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
44f0: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4500: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4510: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4520: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4530: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4540: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
4550: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4560: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4570: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
4580: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
4590: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
45a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
45b0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
45c0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
45d0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
45e0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
45f0: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4600: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4610: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4620: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4630: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4640: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
4650: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
4660: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
4670: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
4680: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
4690: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
46a0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
46b0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
46c0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
46d0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
46e0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
46f0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4700: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4710: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4720: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4730: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4740: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
4750: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
4760: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
4770: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
4780: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
4790: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
47a0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
47b0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
47c0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
47d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
47e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
47f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4800: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4810: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4820: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4830: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4840: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4850: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4860: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4870: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4880: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4890: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
48b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
48c0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
48d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
48e0: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
48f0: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4900: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4920: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4930: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4940: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4950: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4960: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4970: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4980: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4990: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
49a0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
49b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
49c0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
49d0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
49e0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
49f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4a00: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4a10: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4a20: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4a30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4a40: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4a50: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4a60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a70: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4a80: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4a90: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4aa0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4ab0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4ac0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4ad0: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4ae0: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4af0: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4b40: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4b50: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4b60: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4b70: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4b80: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4b90: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4ba0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4bb0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4bc0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4bd0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4be0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4bf0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4c00: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4c10: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4c20: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4c30: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4c40: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4c50: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4c60: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4c70: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4c80: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4c90: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ca0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4cb0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4cc0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4cd0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4ce0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4cf0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4d00: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4d10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4d20: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4d30: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4d40: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4d50: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4d60: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4d70: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4d80: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4d90: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4da0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
4db0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
4dc0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
4dd0: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
4de0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4df0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
4e00: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
4e10: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
4e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4e30: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
4e40: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
4e50: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
4e60: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
4e70: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
4e80: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
4e90: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
4ea0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
4eb0: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
4ec0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
4ed0: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
4ee0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
4ef0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
4f00: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
4f10: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
4f20: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
4f30: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
4f40: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
4f50: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
4f60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4f70: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
4f80: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
4f90: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
4fa0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
4fb0: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
4fc0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
4fd0: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
4fe0: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
4ff0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5000: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5010: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5020: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5030: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5040: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
5050: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
5060: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
5070: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
5080: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
5090: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
50a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
50b0: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
50c0: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
50d0: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
50e0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
50f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5100: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5110: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5120: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5130: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5140: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
5150: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
5160: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
5170: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5190: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
51a0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
51b0: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
51e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
51f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5210: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5220: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5230: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5240: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
5250: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
5260: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
5270: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
5280: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
5290: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
52a0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
52b0: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
52c0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
52d0: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
52e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
52f0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5300: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5310: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5320: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5330: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5340: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
5350: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
5360: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5370: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
5380: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5390: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
53a0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
53b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
53c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
53d0: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
53e0: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
53f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5400: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5410: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5420: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5430: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5440: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
5450: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
5460: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5470: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
5480: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
5490: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
54a0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
54b0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
54c0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
54d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
54e0: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
54f0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5500: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5510: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5520: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5530: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5540: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
5550: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
5560: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
5570: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
5580: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
5590: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
55a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
55b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
55c0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
55d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
55e0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
55f0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5600: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5610: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5620: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5630: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5640: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
5650: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
5660: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
5670: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
5680: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
5690: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
56a0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
56b0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
56c0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
56d0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
56e0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
56f0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5700: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5710: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5720: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5730: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5740: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
5750: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
5760: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
5770: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
5780: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
5790: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
57a0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
57b0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
57c0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
57d0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
57e0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
57f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5800: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5810: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5820: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5830: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5840: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5850: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5860: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5870: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5880: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5890: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
58a0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
58b0: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
58c0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
58d0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
58e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
58f0: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5900: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5910: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5920: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5930: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5940: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5950: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5960: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5970: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5980: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5990: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
59a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
59b0: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
59c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
59d0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
59e0: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
59f0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5a00: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5a10: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5a20: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5a30: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5a40: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5a50: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5a60: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5a70: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5a80: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5a90: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5aa0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5ab0: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5ac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5ad0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5ae0: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5af0: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5b00: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5b10: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5b20: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5b30: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5b40: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5b50: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5b60: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5b70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5b80: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5b90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5ba0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5bb0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5bc0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5bd0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5be0: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5bf0: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5c00: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5c10: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5c20: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5c30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5c40: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5c50: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5c60: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5c70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5c80: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5c90: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ca0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5cb0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5cc0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5cd0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5ce0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5cf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5d00: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5d10: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5d30: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5d40: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5d50: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5d60: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5d70: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5da0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
5dd0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
5de0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
5df0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
5e10: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
5e20: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
5e30: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
5e40: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
5e50: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
5e60: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
5e70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
5e80: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ea0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
5eb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5ed0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
5ee0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
5ef0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
5f00: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5f10: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
5f20: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
5f30: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
5f40: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
5f50: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
5f60: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
5f70: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5f80: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
5f90: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
5fa0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
5fb0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
5fc0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
5fd0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
5fe0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
5ff0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6000: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6010: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6020: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6030: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6040: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
6050: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6060: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
6070: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
6080: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
60a0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
60b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
60c0: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
60d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
60e0: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
60f0: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6100: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6110: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6120: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6130: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6140: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
6150: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6160: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
6170: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
6180: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
6190: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
61a0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
61b0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
61c0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
61d0: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
61e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
61f0: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6200: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6210: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6230: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6240: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
6250: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
6260: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6270: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
6280: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
6290: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
62a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
62b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
62c0: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
62d0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
62e0: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
62f0: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6300: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6310: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6320: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6330: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6340: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
6350: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
6360: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6400: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6410: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6420: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6430: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6440: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6450: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
6460: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
6470: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
6480: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
6490: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
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 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
64c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
64d0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
64e0: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
64f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6500: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6510: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6520: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6530: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6540: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
6550: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
6560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6570: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6580: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6590: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
65a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
65b0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
65c0: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
65d0: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
65e0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
65f0: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6600: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6610: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6620: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6630: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6640: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
6650: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
6660: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
6670: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
6680: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
6690: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
66a0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
66b0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
66c0: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
66d0: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
66e0: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
66f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6700: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6710: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6720: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6730: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6740: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
6750: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
6760: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
6770: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
6780: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
6790: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
67a0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
67b0: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
67c0: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
67d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
67e0: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
67f0: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6800: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6810: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6820: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6830: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6840: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6850: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6860: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6870: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6880: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6890: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
68a0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
68b0: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
68c0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
68d0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
68e0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
68f0: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6900: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6910: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6920: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6930: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6940: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6950: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6960: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6970: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6980: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6990: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
69c0: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
69d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
69e0: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
69f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a00: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6a10: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6a20: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6a30: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6a40: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6a50: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6a60: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6a70: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6a80: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6a90: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6aa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ab0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ac0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6ae0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6af0: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6b00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6b10: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6b20: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6b30: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6b40: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6b50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b60: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6b70: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6b80: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6b90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6ba0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6bb0: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6bc0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6bd0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6be0: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6bf0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6c00: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6c10: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6c20: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6c30: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6c40: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6c50: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6c60: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6c70: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6c80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6c90: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ca0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6cb0: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6cc0: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6cd0: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6ce0: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6cf0: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6d00: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6d10: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6d20: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6d30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6d40: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6d50: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6d60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d70: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6d80: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6d90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6da0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
6db0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
6dc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6dd0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6de0: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
6df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6e00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6e10: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6e20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
6e30: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
6e40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
6e50: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
6e60: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
6e70: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
6e80: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
6e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
6ea0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
6eb0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
6ec0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
6ed0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6ee0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
6ef0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
6f00: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
6f10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
6f20: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
6f30: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
6f40: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
6f50: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
6f60: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
6f70: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
6f80: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
6f90: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
6fa0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
6fb0: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
6fc0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
6fd0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
6fe0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
6ff0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7000: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7010: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7020: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7030: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7040: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
7050: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
7060: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
7070: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
7080: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
7090: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
70a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
70d0: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
70e0: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
70f0: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7100: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7110: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7120: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7130: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7140: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
7150: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
7160: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
7170: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
71a0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
71b0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
71c0: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
71f0: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7200: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7210: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7220: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7230: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7240: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
7250: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7260: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
7270: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
7280: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
7290: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
72a0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
72b0: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
72c0: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
72d0: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
72e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
72f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7300: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7310: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7320: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7330: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7340: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
7350: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
7360: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
7370: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7380: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
7390: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
73a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
73b0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
73c0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
73d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
73e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
73f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7400: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7410: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7420: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7430: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
7440: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7450: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7460: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
7470: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
7480: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
7490: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
74a0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
74b0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
74c0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
74d0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
74e0: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
74f0: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
7500: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
7510: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
7520: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
7530: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
7540: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
7550: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
7560: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
7570: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
7580: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
7590: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
75a0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
75b0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
75c0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
75d0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
75e0: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
75f0: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
7600: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
7610: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7620: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
7630: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
7640: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
7650: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
7660: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
7670: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
7680: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
7690: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
76a0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
76b0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
76c0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
76d0: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
76e0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
76f0: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
7700: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
7710: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
7720: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
7730: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
7740: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
7750: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
7760: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
7770: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
7780: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
7790: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
77a0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
77b0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
77c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
77d0: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
77e0: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
77f0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
7800: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
7810: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
7820: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
7830: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7840: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
7850: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
7860: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
7870: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
7880: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
7890: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
78a0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
78b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
78c0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
78d0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
78e0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
78f0: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
7900: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
7910: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
7920: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
7930: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7940: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
7950: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
7960: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
7970: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7980: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7990: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
79a0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
79b0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
79c0: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
79d0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
79e0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
79f0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
7a00: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7a10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7a20: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7a30: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
7a40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7a50: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
7a60: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
7a70: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7a80: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7a90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
7aa0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
7ab0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
7ac0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
7ad0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
7ae0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
7af0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7b00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7b10: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
7b20: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
7b30: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
7b40: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7b50: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7b60: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7b70: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
7b80: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
7b90: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
7ba0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
7bb0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
7bc0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
7bd0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
7be0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
7bf0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
7c00: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
7c10: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
7c20: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
7c30: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
7c40: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
7c50: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
7c60: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
7c70: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
7c80: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
7c90: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7ca0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
7cb0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
7cc0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
7cd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
7ce0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
7cf0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
7d00: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
7d10: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
7d20: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
7d30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
7d40: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
7d60: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
7d70: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
7d80: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
7d90: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
7da0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
7db0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
7dc0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
7dd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7de0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
7df0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
7e00: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
7e10: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
7e20: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
7e30: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
7e40: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
7e50: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
7e60: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
7e70: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
7e80: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
7e90: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
7ea0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
7eb0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
7ec0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
7ed0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
7ee0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
7ef0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
7f00: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
7f10: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
7f20: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
7f30: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
7f40: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
7f50: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
7f60: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
7f70: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
7f80: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
7f90: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
7fa0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
7fb0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
7fc0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
7fd0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
7fe0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
7ff0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
8000: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
8010: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
8020: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
8030: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
8040: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
8050: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
8060: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
8070: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
8080: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
8090: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
80a0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
80b0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
80c0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
80d0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
80e0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
80f0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
8100: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
8110: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
8120: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8130: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
8140: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
8150: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8160: 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Off);.    pPager
8170: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8180: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
8190: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
81a0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
81b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
81c0: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
81d0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
81e0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
81f0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
8200: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
8210: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
8220: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
8230: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
8240: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
8250: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
8260: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
8270: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
8280: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
8290: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
82a0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
82b0: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
82c0: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
82d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
82e0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
82f0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
8300: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
8310: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
8320: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
8330: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
8340: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
8350: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
8360: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
8370: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
8380: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
8390: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
83a0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
83b0: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
83c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
83d0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
83e0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
83f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8400: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
8410: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
8420: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
8430: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
8440: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
8450: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
8460: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
8470: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
8480: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
8490: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
84a0: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
84b0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
84c0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
84d0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
84e0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
84f0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8500: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8510: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
8520: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
8530: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8540: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
8550: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
8560: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
8570: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
8580: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
8590: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
85a0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
85c0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
85d0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
85e0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
85f0: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
8600: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8610: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
8620: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8630: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
8640: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
8650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8660: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
8670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
8680: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
8690: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
86a0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
86b0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
86c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
86d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
86e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
86f0: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
8700: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
8710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
8720: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
8730: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8740: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
8750: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
8760: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
8770: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
8780: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
8790: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
87a0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
87b0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
87c0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
87d0: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
87e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
87f0: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
8800: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8810: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8820: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8830: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8840: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
8850: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
8860: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
8870: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8880: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
8890: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
88a0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
88b0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
88c0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
88d0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
88e0: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
88f0: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
8900: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
8910: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
8920: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
8930: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
8940: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
8950: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
8960: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
8970: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
8980: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
8990: 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  d..  */.  rc = s
89a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
89b0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
89c0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
89d0: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66  , iHdrOff);.  if
89e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
89f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
8a00: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8a10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
8a20: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
8a30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8a40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8a50: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
8a60: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
8a70: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
8a80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
8a90: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
8aa0: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
8ab0: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
8ac0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
8ad0: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
8ae0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
8af0: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
8b00: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
8b10: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
8b20: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
8b30: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
8b40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8b50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8b60: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
8b70: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8b80: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8b90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8ba0: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
8bb0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
8bc0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8bd0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8be0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8bf0: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
8c00: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
8c10: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
8c20: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8c30: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
8c40: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c60: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
8c70: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
8c80: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
8c90: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8ca0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
8cb0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
8cc0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
8cd0: 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a      u16 iPageSiz
8ce0: 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20  e16;            
8cf0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67   /* Copy of iPag
8d00: 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20  eSize in 16-bit 
8d10: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
8d20: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
8d30: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
8d40: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
8d50: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
8d60: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8d70: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8d80: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8d90: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
8da0: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
8db0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8dc0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8dd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8de0: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
8df0: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
8e00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8e10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
8e20: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
8e30: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
8e40: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
8e50: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8e60: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
8e70: 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
8e80: 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
8e90: 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
8ea0: 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
8eb0: 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
8ec0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
8ed0: 74 6f 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20  to 512, and not 
8ee0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
8ef0: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
8f00: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
8f10: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
8f20: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
8f30: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
8f60: 35 31 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  512.     || iPag
8f70: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
8f80: 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
8f90: 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
8fa0: 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
8fb0: 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
8fc0: 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
8fd0: 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
8fe0: 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
8ff0: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
9000: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
9010: 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
9020: 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
9030: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
9040: 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
9050: 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
9060: 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
9070: 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
9080: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
9090: 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
90a0: 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
90b0: 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
90c0: 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
90d0: 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
90e0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
90f0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
9100: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9120: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
9130: 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
9140: 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
9150: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
9160: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
9170: 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
9180: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
9190: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
91a0: 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
91b0: 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
91c0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
91d0: 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
91e0: 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69    */.    iPageSi
91f0: 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50 61 67  ze16 = (u16)iPag
9200: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
9210: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
9220: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
9230: 26 69 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20  &iPageSize16);. 
9240: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
9250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9260: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9270: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65  LITE_OK || iPage
9280: 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61  Size16==(u16)iPa
9290: 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
92a0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
92b0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
92c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
92d0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
92e0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
92f0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
9300: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
9310: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
9320: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
9330: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
9340: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
9350: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
9360: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
9370: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
9380: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
9390: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
93a0: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
93b0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
93c0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
93d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
93e0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
93f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
9400: 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
9410: 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
9420: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9430: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
9440: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
9450: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
9460: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
9470: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
9480: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
9490: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
94a0: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
94b0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
94c0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
94d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
94e0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
94f0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
9500: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
9510: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
9520: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
9530: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
9540: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
9550: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9560: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
9570: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
9580: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
9590: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
95a0: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
95b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
95c0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
95d0: 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
95e0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
95f0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
9600: 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
9610: 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
9620: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9630: 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
9640: 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
9650: 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
9660: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
9670: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
9680: 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
9690: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
96a0: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
96b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
96c0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
96d0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
96e0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
96f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
9700: 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
9710: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
9720: 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
9730: 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
9740: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
9750: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
9760: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
9770: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
9780: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
9790: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
97a0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
97b0: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
97c0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
97d0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
97e0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
97f0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9810: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9820: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9850: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
9860: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
9890: 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
98a0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
98b0: 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98d0: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
98e0: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
98f0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
9900: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9910: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
9920: 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
9930: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d  er */..  if( !zM
9940: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
9950: 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c  >setMaster.   ||
9960: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9970: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9980: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9990: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
99a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
99b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
99c0: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
99d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
99e0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
99f0: 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
9a00: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
9a10: 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
9a20: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
9a30: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
9a40: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
9a50: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
9a60: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
9a70: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
9a80: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
9a90: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
9aa0: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
9ab0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
9ac0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
9ad0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
9ae0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
9af0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
9b00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9b10: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
9b20: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
9b30: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
9b40: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
9b50: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
9b60: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
9b70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
9b80: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
9b90: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9ba0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
9bb0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
9bc0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
9bd0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9be0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
9bf0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9c00: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
9c10: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
9c20: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
9c30: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9c40: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
9c50: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
9c60: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
9c70: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
9c80: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9c90: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
9ca0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
9cb0: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
9cc0: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
9cd0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9ce0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
9cf0: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
9d00: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
9d10: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9d20: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9d30: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9d40: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
9d50: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
9d60: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
9d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9d80: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
9d90: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
9da0: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
9db0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9dc0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
9dd0: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
9de0: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
9df0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9e00: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
9e10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9e20: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
9e30: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9e40: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
9e50: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
9e60: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
9e70: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
9e80: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
9e90: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
9ea0: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
9eb0: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
9ec0: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
9ed0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
9ee0: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
9ef0: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
9f00: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
9f10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
9f20: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
9f30: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
9f40: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
9f50: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
9f60: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
9f70: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
9f80: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
9f90: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
9fa0: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
9fb0: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
9fc0: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
9fd0: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
9fe0: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
9ff0: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
a000: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
a010: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
a020: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
a030: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
a040: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
a050: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a060: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
a070: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
a080: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
a090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
a0a0: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
a0b0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a0c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
a0d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
a0e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a0f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
a100: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
a110: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
a120: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
a130: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
a140: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
a150: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
a160: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
a170: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
a180: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
a190: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
a1a0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
a1b0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
a1c0: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
a1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a1f0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
a200: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
a210: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
a220: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
a230: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
a240: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
a250: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
a260: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
a270: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
a280: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
a290: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
a2a0: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
a2b0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
a2c0: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
a2d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
a2e0: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
a2f0: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a300: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
a310: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
a320: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
a330: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a340: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
a350: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
a360: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
a370: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
a380: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
a390: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
a3a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a3b0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
a3c0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
a3d0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
a3e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
a3f0: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
a400: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
a410: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
a420: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
a430: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
a440: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
a450: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
a460: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
a470: 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
a480: 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
a490: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
a4a0: 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
a4b0: 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
a4c0: 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
a4d0: 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
a4e0: 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
a4f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
a500: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
a510: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
a520: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
a530: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a540: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
a550: 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
a560: 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
a570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a580: 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
a590: 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
a5a0: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
a5b0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
a5c0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a5d0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
a5e0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
a5f0: 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
a600: 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
a610: 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
a620: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
a630: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
a640: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
a650: 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
a660: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
a670: 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
a680: 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
a690: 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
a6a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
a6b0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
a6c0: 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
a6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
a6e0: 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
a6f0: 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
a700: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
a710: 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
a720: 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
a730: 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
a740: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
a750: 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
a760: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
a770: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
a780: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
a790: 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
a7a0: 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
a7b0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
a7c0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a7f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
a800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
a810: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
a820: 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
a830: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
a840: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
a850: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
a860: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
a870: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
a880: 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
a890: 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
a8a0: 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
a8b0: 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
a8c0: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
a8d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
a8e0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a8f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a900: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
a910: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
a920: 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
a930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a940: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
a950: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a960: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a970: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
a980: 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65  pager.** is in e
a990: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
a9a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
a9b0: 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
a9c0: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
a9d0: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
a9e0: 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63  nts of .** the c
a9f0: 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74  ache and reset t
aa00: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
aa10: 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  re internal stat
aa20: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  e. If there is.*
aa30: 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  * an open journa
aa40: 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  l-file, then the
aa50: 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61   next time a sha
aa60: 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  red-lock is obta
aa70: 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70  ined.** on the p
aa80: 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68  ager file (by th
aa90: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
aaa0: 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c  process), it wil
aab0: 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20  l be.** treated 
aac0: 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
aad0: 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
aae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aaf0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
ab00: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
ab10: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
ab20: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
ab30: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab50: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ab60: 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
ab70: 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
ab80: 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
ab90: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
aba0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f  e lock..    ** O
abb0: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
abc0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
abd0: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
abe0: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
abf0: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
ac00: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
ac10: 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
ac20: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ac30: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
ac40: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
ac50: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
ac60: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
ac70: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
ac80: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  al = 0;.    rele
ac90: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
aca0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
acb0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
acc0: 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62   unlocked, someb
acd0: 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63  ody else might c
ace0: 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20  hange it. The.  
acf0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72    ** values stor
ad00: 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69  ed in Pager.dbSi
ad10: 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65  ze etc. might be
ad20: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a  come invalid if.
ad30: 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70      ** this happ
ad40: 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c  ens. TODO: Reall
ad50: 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20  y, this doesn't 
ad60: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
ad70: 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20  ed.    ** until 
ad80: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
ad90: 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69  er check fails i
ada0: 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  n pagerSharedLoc
adb0: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
adc0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
add0: 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  lid = 0;..    rc
ade0: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
adf0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
ae00: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
ae10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
ae20: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
ae30: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
ae40: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
ae50: 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49  ager))..    /* I
ae60: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
ae70: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
ae80: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
ae90: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
aea0: 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64  e.    ** trusted
aeb0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
aec0: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
aed0: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
aee0: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
aef0: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
af00: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
af10: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
af20: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
af30: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
af40: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
af50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
af60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
af70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
af80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
af90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
afa0: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
afb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
afc0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
afd0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
afe0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
aff0: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d  ER_UNLOCK;.  }.}
b000: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b010: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
b020: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
b030: 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72  OERR, CORRUPT or
b040: 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d   FULL error.** m
b050: 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
b060: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
b070: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
b080: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a  r to the pager .
b090: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
b0a0: 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  e second the err
b0b0: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
b0c0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
b0d0: 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20  a pager .** API 
b0e0: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
b0f0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
b100: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
b110: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a  cond argument .*
b120: 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
b130: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
b140: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b150: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
b160: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
b170: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
b180: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
b190: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
b1a0: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
b1b0: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
b1c0: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
b1d0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
b1e0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
b1f0: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
b200: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
b210: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
b220: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
b230: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
b240: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
b250: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b260: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
b270: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
b280: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
b290: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
b2a0: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
b2b0: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
b2c0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b2d0: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
b2e0: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
b2f0: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
b300: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b310: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
b320: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
b330: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
b340: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
b350: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
b360: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
b370: 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
b380: 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
b390: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
b3a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b3b0: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
b3c0: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
b3d0: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
b3e0: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
b3f0: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
b400: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
b410: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
b420: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
b430: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
b440: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
b450: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
b460: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
b470: 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53    if(.    rc2==S
b480: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
b490: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
b4a0: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
b4b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20  SQLITE_CORRUPT. 
b4c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b4d0: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
b4e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
b4f0: 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
b500: 4b 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  K .     && sqlit
b510: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
b520: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
b530: 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
b540: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
b550: 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e  er is already un
b560: 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67  locked, call pag
b570: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20  er_unlock() now 
b580: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  to.      ** clea
b590: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
b5a0: 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61  e and ensure tha
b5b0: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
b5c0: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63  e is .      ** c
b5d0: 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
b5e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b5f0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
b600: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
b610: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b620: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
b630: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
b640: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
b650: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
b660: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
b670: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
b680: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
b690: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
b6a0: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
b6b0: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
b6c0: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
b6d0: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
b6e0: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
b6f0: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
b700: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
b710: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
b720: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
b730: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
b740: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
b750: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
b760: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
b770: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
b780: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
b790: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
b7a0: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
b7b0: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
b7c0: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
b7d0: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
b7e0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
b7f0: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
b800: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
b810: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
b820: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
b830: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
b840: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
b850: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
b860: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
b870: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
b880: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
b890: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
b8a0: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
b8b0: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
b8c0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
b8d0: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
b8e0: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
b8f0: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
b900: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
b910: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
b920: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
b930: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
b940: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
b950: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b960: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b970: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
b980: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
b990: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
b9a0: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
b9b0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
b9c0: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
b9d0: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
b9e0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
b9f0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
ba00: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
ba10: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
ba20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ba30: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
ba40: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
ba50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
ba60: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
ba70: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
ba80: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
ba90: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
baa0: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
bab0: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
bac0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
bad0: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
bae0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
baf0: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
bb00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bb10: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
bb20: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
bb30: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
bb40: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
bb50: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
bb60: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bb70: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
bb80: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
bb90: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
bba0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
bbb0: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
bbc0: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
bbd0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
bbe0: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
bbf0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
bc00: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
bc10: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
bc20: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
bc30: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
bc40: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
bc50: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
bc60: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
bc70: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
bc80: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
bc90: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
bca0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
bcb0: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
bcc0: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
bcd0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
bce0: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
bcf0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
bd00: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
bd10: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
bd20: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
bd30: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
bd40: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bd50: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
bd60: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
bd70: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
bd80: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
bd90: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
bda0: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
bdb0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bdc0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
bdd0: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
bde0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
bdf0: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
be00: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
be10: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
be20: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
be30: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
be40: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
be50: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
be60: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
be70: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
be80: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
be90: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
bea0: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
beb0: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
bec0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bed0: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
bee0: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
bef0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
bf00: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
bf10: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
bf20: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
bf30: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
bf40: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
bf50: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
bf60: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
bf70: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
bf80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
bf90: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
bfa0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
bfb0: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
bfc0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
bfd0: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
bfe0: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
bff0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
c000: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c010: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
c020: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
c030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c040: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
c050: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
c060: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
c070: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
c080: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
c090: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
c0a0: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c0b0: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
c0c0: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c0d0: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
c0e0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
c0f0: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
c100: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
c110: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
c120: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
c130: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
c140: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
c150: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
c160: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
c170: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
c180: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
c190: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
c1a0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
c1b0: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
c1c0: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
c1d0: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
c1e0: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
c1f0: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
c200: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
c210: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
c220: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
c230: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
c240: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c250: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
c260: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c270: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c280: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
c290: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
c2a0: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
c2b0: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
c2c0: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
c2d0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
c2e0: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
c2f0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c300: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
c310: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
c320: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
c330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c340: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
c350: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
c360: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
c370: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c380: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
c390: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
c3a0: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
c3b0: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
c3c0: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
c3d0: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
c3e0: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
c3f0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
c400: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
c410: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
c420: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
c430: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c440: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
c450: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
c460: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
c470: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
c480: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c490: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
c4a0: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
c4b0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
c4c0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
c4d0: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c4e0: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
c4f0: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
c500: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
c510: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
c520: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c530: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c550: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
c560: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
c570: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
c580: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c590: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
c5a0: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
c5b0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
c5c0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20  ager->jfd) ){.. 
c5d0: 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72     /* TODO: Ther
c5e0: 65 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65  e's a problem he
c5f0: 72 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  re if a journal-
c600: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
c610: 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a  in MEMORY.    **
c620: 20 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74   mode and then t
c630: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
c640: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52  is changed to TR
c650: 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53  UNCATE or PERSIS
c660: 54 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20  T.    ** during 
c670: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
c680: 20 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c   This code shoul
c690: 64 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  d be changed to 
c6a0: 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68  assume.    ** th
c6b0: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
c6c0: 6f 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ode has not chan
c6d0: 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72  ged since the tr
c6e0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
c6f0: 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e    ** started. An
c700: 64 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  d the sqlite3Pag
c710: 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20  erJournalMode() 
c720: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
c730: 62 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  be.    ** change
c740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
c750: 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20  hat this is the 
c760: 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f  case too..    */
c770: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
c780: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
c790: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
c7a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
c7b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
c7c0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
c7d0: 20 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f        int isMemo
c7e0: 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  ryJournal = sqli
c7f0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
c800: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c810: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c820: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
c830: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65  .      if( !isMe
c840: 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  moryJournal ){. 
c850: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c860: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
c870: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
c880: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
c890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
c8a0: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
c8b0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
c8c0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
c8d0: 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
c8e0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
c8f0: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
c900: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c910: 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
c920: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c930: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
c940: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
c950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c970: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
c980: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
c990: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
c9a0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
c9b0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
c9c0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
c9d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
c9e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
c9f0: 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20  SIST.    ){.    
ca00: 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
ca10: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
ca20: 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
ca30: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
ca40: 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
ca50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ca60: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
ca70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
ca80: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
ca90: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
caa0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cab0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
cac0: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
cad0: 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73  || rc );.      s
cae0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
caf0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
cb00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cb10: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
cb20: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
cb30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cb40: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
cb50: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
cb60: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
cb70: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
cb80: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
cb90: 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65  PAGES.    sqlite
cba0: 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
cbb0: 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
cbc0: 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
cbd0: 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66  agehash);.#endif
cbe0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ..    sqlite3Pca
cbf0: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
cc00: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
cc10: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
cc20: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
cc30: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
cc40: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
cc50: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  al = 0;.    pPag
cc60: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
cc70: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
cc80: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
cc90: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
cca0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
ccb0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
ccc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
ccd0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
cce0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
ccf0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
cd00: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
cd10: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
cd20: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
cd30: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cd40: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
cd50: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
cd60: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
cd70: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cd80: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
cd90: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
cda0: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
cdb0: 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57   this optimal? W
cdc0: 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a  hy is the db siz
cdd0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65  e invalidated he
cde0: 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  re .  ** when th
cdf0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
ce00: 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f  is not unlocked?
ce10: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
ce20: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
ce30: 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
ce40: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
ce50: 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
ce60: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d  bSize);.  if( !M
ce70: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
ce80: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
ce90: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
cea0: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
ceb0: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
cec0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
ced0: 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
cee0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
cef0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
cf00: 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
cf10: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
cf20: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
cf30: 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
cf40: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
cf50: 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
cf60: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
cf70: 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
cf80: 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
cf90: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
cfa0: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
cfb0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
cfc0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
cfd0: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
cfe0: 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
cff0: 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
d000: 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
d010: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
d020: 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
d030: 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
d040: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d050: 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
d060: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
d070: 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
d080: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
d090: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
d0a0: 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
d0b0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
d0c0: 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
d0d0: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
d0e0: 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
d0f0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
d100: 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
d110: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
d120: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
d130: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
d140: 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
d150: 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
d160: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
d170: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
d180: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
d190: 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
d1a0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
d1b0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
d1c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
d1d0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
d1e0: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
d1f0: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
d200: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
d210: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
d220: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
d230: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
d240: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
d250: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
d260: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
d270: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
d280: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
d290: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
d2a0: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
d2b0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
d2c0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
d2d0: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
d2e0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
d2f0: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
d300: 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
d310: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d320: 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
d330: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
d340: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
d350: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
d360: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
d370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
d380: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d390: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
d3a0: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
d3b0: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
d3c0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
d3d0: 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
d3e0: 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
d3f0: 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
d400: 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
d410: 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
d420: 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
d430: 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
d440: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
d450: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
d460: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d470: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
d480: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
d490: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
d4a0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
d4b0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
d4c0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d4d0: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
d4e0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
d4f0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
d500: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
d510: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
d520: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
d530: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
d540: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
d550: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
d560: 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
d570: 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
d580: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
d590: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
d5a0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
d5b0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
d5c0: 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
d5d0: 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
d5e0: 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
d5f0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d600: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
d610: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
d620: 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
d630: 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
d640: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
d650: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
d660: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
d670: 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
d680: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
d690: 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
d6a0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
d6b0: 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
d6c0: 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
d6d0: 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
d6e0: 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
d6f0: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
d700: 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
d710: 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
d720: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
d730: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
d740: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
d750: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
d760: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
d770: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
d780: 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
d790: 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
d7a0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d7b0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d7c0: 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
d7d0: 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
d7e0: 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
d7f0: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
d800: 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
d810: 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
d820: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
d830: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d840: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
d850: 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
d860: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
d870: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
d880: 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
d890: 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
d8a0: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
d8b0: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
d8c0: 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
d8d0: 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
d8e0: 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
d8f0: 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
d900: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
d910: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
d920: 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
d930: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
d940: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
d950: 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
d960: 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
d970: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
d980: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
d990: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
d9a0: 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
d9b0: 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
d9c0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
d9d0: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
d9e0: 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
d9f0: 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
da00: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
da10: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
da20: 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
da30: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
da40: 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
da50: 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
da60: 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
da70: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
da80: 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
da90: 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
daa0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
dab0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
dac0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
dad0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
dae0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
daf0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
db00: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
db10: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
db20: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
db30: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
db40: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
db50: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
db60: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
db70: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
db80: 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c  .  int isUnsync,
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
dbb0: 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65  ing from unsynce
dbc0: 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  d main journal *
dbd0: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
dbe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dbf0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
dc00: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
dc10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  k */.  int isSav
dc20: 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  epnt,           
dc30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
dc40: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dc50: 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  lback */.  Bitve
dc60: 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20  c *pDone        
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
dc80: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
dc90: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
dca0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
dcb0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
dce0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
dcf0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
dd20: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
dd30: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
dd40: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd60: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
dd70: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
dd80: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
dd90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
dda0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
ddb0: 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
ddc0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
ddd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ddf0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
de00: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
de10: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  al file */..  as
de20: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
de30: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
de40: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
de50: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
de60: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
de70: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
de80: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
de90: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
dea0: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
deb0: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
dec0: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
ded0: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
dee0: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
def0: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
df00: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
df10: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
df20: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
df30: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
df40: 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  (u8*)pPager->pTm
df50: 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
df60: 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
df70: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
df80: 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
df90: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
dfa0: 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  ted */..  /* Rea
dfb0: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
dfc0: 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
dfd0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
dfe0: 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
dff0: 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
e000: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
e010: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
e020: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e030: 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
e040: 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
e050: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
e060: 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
e070: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
e080: 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
e090: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
e0a0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e0b0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
e0c0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
e0d0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
e0e0: 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
e0f0: 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
e100: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e110: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
e120: 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
e130: 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
e140: 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
e150: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
e160: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
e170: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
e180: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
e190: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
e1a0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
e1b0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
e1c0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
e1d0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
e1e0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
e1f0: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
e200: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
e210: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e220: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
e230: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
e240: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
e250: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
e260: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
e270: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
e280: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
e290: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
e2a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e2b0: 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
e2c0: 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
e2d0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
e2e0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
e2f0: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
e300: 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
e310: 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
e320: 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
e330: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e340: 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
e350: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
e360: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
e370: 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
e380: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
e390: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e3a0: 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
e3b0: 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
e3c0: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
e3d0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
e3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
e3f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e400: 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
e410: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
e420: 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
e430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e440: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e450: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
e460: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e470: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
e480: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e490: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
e4a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
e4b0: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
e4c0: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
e4d0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
e4e0: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
e4f0: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
e500: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
e510: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
e520: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
e530: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
e540: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
e550: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
e560: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
e570: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
e580: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
e590: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
e5a0: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
e5b0: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
e5c0: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
e5d0: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
e5e0: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
e5f0: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
e600: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
e610: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
e620: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e630: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
e640: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
e650: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
e660: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
e670: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
e680: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
e690: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
e6a0: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
e6b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
e6c0: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
e6d0: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
e6e0: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
e6f0: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
e700: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
e710: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
e720: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
e730: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
e740: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
e750: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
e760: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
e770: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
e780: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
e790: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
e7a0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
e7b0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
e7c0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
e7d0: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
e7e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
e7f0: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
e800: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
e810: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
e820: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
e830: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
e840: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
e850: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
e860: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
e870: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
e880: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
e890: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
e8a0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
e8b0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
e8c0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
e8d0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
e8e0: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
e8f0: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
e900: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
e910: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
e920: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
e930: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
e940: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
e950: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
e960: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
e970: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
e980: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
e990: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
e9a0: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
e9b0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
e9c0: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
e9d0: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
e9e0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
e9f0: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
ea00: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
ea10: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
ea20: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
ea30: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ea40: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
ea50: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
ea60: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
ea70: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
ea80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
ea90: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
eaa0: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
eab0: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
eac0: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
ead0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
eae0: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
eaf0: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
eb00: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
eb10: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
eb20: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
eb30: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
eb40: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
eb50: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
eb60: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
eb70: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
eb80: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
eb90: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
eba0: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
ebb0: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
ebc0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
ebd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
ebe0: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
ebf0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
ec00: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
ec10: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ec20: 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
ec30: 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
ec40: 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
ec50: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
ec60: 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
ec80: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
ec90: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
eca0: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
ecb0: 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20  ize, aData),.   
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d              (isM
ecd0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
ece0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
ecf0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
ed00: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
ed10: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ed20: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
ed30: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
ed40: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
ed50: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
ed60: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
ed70: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
ed80: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
ed90: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
eda0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
edb0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
edc0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
edd0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
ede0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
edf0: 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
ee00: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
ee10: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
ee20: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
ee30: 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
ee40: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
ee50: 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
ee60: 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 61  pBackup, pgno, a
ee70: 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Data);.  }else i
ee80: 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
ee90: 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
eea0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
eeb0: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
eec0: 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
eed0: 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
eee0: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
eef0: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
ef00: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
ef10: 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
ef20: 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
ef30: 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
ef40: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
ef50: 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
ef60: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
ef70: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
ef80: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
ef90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
efa0: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
efb0: 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
efc0: 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
efd0: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
efe0: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
eff0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
f000: 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
f010: 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
f020: 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
f030: 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
f040: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
f050: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
f060: 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
f070: 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
f080: 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
f090: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
f0a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
f0b0: 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
f0c0: 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
f0d0: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
f0e0: 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
f0f0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
f100: 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
f110: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
f120: 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
f130: 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
f140: 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
f150: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
f160: 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
f170: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
f180: 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
f190: 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
f1a0: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
f1b0: 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
f1c0: 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
f1d0: 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
f1e0: 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
f1f0: 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
f200: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f210: 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
f220: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
f230: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
f240: 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
f250: 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
f260: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f270: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f280: 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
f290: 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
f2a0: 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
f2b0: 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
f2c0: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
f2d0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
f2e0: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
f2f0: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
f300: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
f310: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
f320: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
f330: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
f340: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
f350: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
f360: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
f370: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
f380: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
f390: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
f3a0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f3b0: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
f3c0: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
f3d0: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
f3e0: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
f3f0: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
f400: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
f410: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
f420: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
f430: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
f440: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
f450: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
f460: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
f470: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
f480: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
f490: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
f4a0: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
f4b0: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f4c0: 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
f4d0: 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
f4e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
f4f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f500: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
f510: 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
f520: 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
f530: 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
f540: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f550: 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
f560: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
f570: 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
f580: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
f590: 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
f5a0: 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
f5b0: 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
f5c0: 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
f5d0: 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
f5e0: 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
f5f0: 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
f600: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
f610: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
f620: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
f630: 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
f640: 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
f650: 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
f660: 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
f670: 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
f680: 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
f690: 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
f6a0: 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
f6b0: 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
f6c0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
f6d0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
f6e0: 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
f6f0: 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
f700: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
f710: 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
f720: 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
f730: 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
f740: 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
f750: 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
f760: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
f770: 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
f780: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
f790: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
f7a0: 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
f7b0: 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
f7c0: 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
f7d0: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
f7e0: 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
f7f0: 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
f800: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
f810: 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
f820: 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
f830: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
f840: 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
f850: 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
f860: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
f870: 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
f880: 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
f890: 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
f8a0: 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
f8b0: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
f8c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f8d0: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
f8e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
f8f0: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
f900: 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
f910: 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
f920: 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
f930: 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
f940: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
f950: 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
f960: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
f970: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
f980: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
f990: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
f9a0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
f9b0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
f9c0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
f9d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
f9e0: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
f9f0: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
fa00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
fa10: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
fa20: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
fa30: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
fa40: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
fa50: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
fa60: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
fa70: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
fa80: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
fa90: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
faa0: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
fab0: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
fac0: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
fad0: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
fae0: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
faf0: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
fb00: 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c  gno, 3);.    sql
fb10: 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
fb20: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
fb30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
fb40: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
fb50: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
fb60: 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
fb70: 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
fb80: 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61 64  tine looks ahead
fb90: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
fba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
fbb0: 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68  determines.** wh
fbc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
fbd0: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74 68   next record (th
fbe0: 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 62 65  e record that be
fbf0: 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a 20  gins at file.** 
fc00: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 6a  offset pPager->j
fc10: 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61 20  ournalOff) is a 
fc20: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67 65  well-formed page
fc30: 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 69   record consisti
fc40: 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69 64  ng.** of a valid
fc50: 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70 50   page number, pP
fc60: 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  age->pageSize by
fc70: 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c 20  tes of content, 
fc80: 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 61  followed.** by a
fc90: 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d 2e   valid checksum.
fca0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
fcb0: 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
fcc0: 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72 64  know this in ord
fcd0: 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62  er to do its job
fce0: 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  .   This.** rout
fcf0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
fd00: 20 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65 72   from with asser
fd10: 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
fd20: 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73 74  () macros..*/.st
fd30: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e 65  atic int pagerNe
fd40: 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56  xtJournalPageIsV
fd50: 61 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61 67  alid(Pager *pPag
fd60: 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  er){.  Pgno pgno
fd70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
fd80: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
fd90: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
fda0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
fdb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
fdc0: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
fdd0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
fde0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
fdf0: 64 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70 65  de from read ope
fe00: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c  rations */.  sql
fe10: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
fe20: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
fe30: 73 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77 68  scriptor from wh
fe40: 69 63 68 20 77 65 20 61 72 65 20 72 65 61 64 69  ich we are readi
fe50: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
fe60: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
fe70: 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
fe80: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  age */..  /* Rea
fe90: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
fea0: 72 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66 64  r header */.  fd
feb0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a   = pPager->jfd;.
fec0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
fed0: 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
fee0: 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f 29  urnalOff, &pgno)
fef0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ff00: 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
ff10: 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
ff40: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
ff50: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
ff60: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
ff70: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
ff80: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
ff90: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  /.  if( pgno>(Pg
ffa0: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
ffb0: 65 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  e ){ return 0; }
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
ffe0: 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
fff0: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72   checksum */.  r
10000 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
10010 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
10020 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61  alOff+pPager->pa
10030 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d  geSize+4, &cksum
10040 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10050 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e  ITE_OK ){ return
10060 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
10090 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
100a0 65 20 64 61 74 61 20 61 6e 64 20 76 65 72 69 66  e data and verif
100b0 79 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a  y the checksum *
100c0 2f 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a  /.  aData = (u8*
100d0 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
100e0 63 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ce;.  rc = sqlit
100f0 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44 61  e3OsRead(fd, aDa
10100 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
10110 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  Size, pPager->jo
10120 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20 69  urnalOff+4);.  i
10130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10140 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69   /*NO_TEST*/.  i
10180 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
10190 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
101a0 6b 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20 30  ksum ){ return 0
101b0 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
101c0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20   /*NO_TEST*/..  
101d0 2f 2a 20 52 65 61 63 68 20 74 68 69 73 20 70 6f  /* Reach this po
101e0 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  int only if the 
101f0 70 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a 2f  page is valid */
10200 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
10210 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10220 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
10230 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
10240 52 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 2f  RAGE_TEST) */../
10250 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
10260 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
10270 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
10280 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
10290 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
102a0 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
102b0 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
102c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
102d0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
102e0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
102f0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10300 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
10310 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
10320 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10330 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
10340 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
10350 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
10360 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
10370 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
10380 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
10390 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
103a0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
103b0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
103c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
103d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
103e0 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
103f0 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
10400 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
10410 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
10420 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
10430 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
10440 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
10450 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
10460 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
10470 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
10480 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
10490 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
104a0 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
104b0 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
104c0 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
104d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
104e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
104f0 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
10500 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
10510 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
10520 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
10530 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
10540 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
10550 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
10560 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
10570 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
10580 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
10590 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
105a0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
105b0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
105c0 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
105d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
105e0 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
105f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10600 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10610 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
10620 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
10630 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
10640 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10650 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
10660 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
10670 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
10680 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
10690 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
106a0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
106b0 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
106c0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
106d0 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
106e0 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
106f0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
10700 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
10710 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
10720 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
10730 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
10740 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
10750 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
10760 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
10770 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
10780 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
10790 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
107a0 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
107b0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
107c0 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
107d0 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
107e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
107f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
10800 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
10810 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
10820 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
10830 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
10840 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
10850 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
10860 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
10870 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
10880 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
10890 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
108a0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
108b0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
108c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
108d0 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
108e0 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
108f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
10900 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
10910 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
10920 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
10930 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
10940 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
10950 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10960 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
10970 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
10980 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
10990 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
109a0 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
109b0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
109c0 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
109d0 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
109e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
109f0 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
10a00 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10a10 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10a20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
10a30 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
10a40 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
10a70 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
10a80 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
10a90 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
10aa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10ab0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
10ac0 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
10ad0 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
10ae0 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
10af0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10b00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
10b10 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
10b20 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
10b30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10b40 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
10b50 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
10b60 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
10b70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10b80 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
10b90 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
10ba0 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
10bb0 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
10bc0 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
10bd0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
10be0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
10bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10c00 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
10c10 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
10c20 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
10c30 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
10c40 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
10c50 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
10c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
10c70 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
10c80 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
10c90 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
10ca0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
10cb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
10cc0 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
10cd0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
10ce0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10cf0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
10d00 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
10d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d20 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
10d30 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
10d40 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
10d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10d60 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
10d70 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _out;..  rc = sq
10d80 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10d90 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
10da0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
10db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10dc0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10dd0 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
10de0 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
10df0 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
10e00 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
10e10 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
10e20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
10e30 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
10e40 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
10e50 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
10e60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10e70 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
10e80 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
10e90 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
10ea0 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
10eb0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
10ec0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
10ed0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
10ee0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
10ef0 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
10f00 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
10f10 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
10f20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
10f30 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
10f40 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10f50 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
10f60 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
10f70 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d      zMasterPtr =
10f80 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
10f90 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
10fa0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
10fb0 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
10fc0 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
10fd0 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
10fe0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69  urnal, 0);.    i
10ff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11000 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
11010 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
11020 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
11030 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
11040 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
11050 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
11060 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11070 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
11080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11090 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
110a0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
110b0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
110c0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
110d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
110e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
110f0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11110 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
11120 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
11130 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
11140 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
11150 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
11160 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
11170 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
11180 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
11190 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
111a0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
111b0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
111c0 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
111d0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
111e0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
111f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
11200 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
11210 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
11220 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
11230 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11240 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
11250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
11260 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
11270 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
11280 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
11290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
112a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
112b0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
112c0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
112d0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
112e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
112f0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
11300 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
11310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11320 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
11330 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11350 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
11360 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
11370 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
11380 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
11390 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
113a0 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
113b0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
113c0 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
113d0 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
113e0 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
113f0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
11400 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
11410 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
11420 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11440 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
11450 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
11460 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
11470 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
11480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11490 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
114a0 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
114b0 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
114c0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
114d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
114e0 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
114f0 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
11500 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
11510 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
11520 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
11530 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
11540 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73  rnal) );.  }.  s
11550 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
11560 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
11570 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
11580 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
11590 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
115a0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
115b0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
115c0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
115d0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
115e0 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
115f0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
11600 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
11610 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
11620 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
11630 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
11640 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11650 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
11660 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
11670 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
11680 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
11690 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
116a0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
116b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
116c0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
116d0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
116e0 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
116f0 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
11700 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
11710 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
11720 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
11730 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
11740 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
11750 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
11760 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
11770 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
11780 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
11790 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
117a0 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
117b0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
117c0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
117d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
117e0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
117f0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11800 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
11810 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
11820 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
11830 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
11840 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
11850 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
11860 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
11870 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
11880 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
11890 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
118a0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
118b0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
118c0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
118d0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
118e0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
118f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
11900 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
11910 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
11920 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
11930 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
11940 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
11950 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
11960 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11970 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
11980 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
11990 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
119a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
119b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
119c0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
119d0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
119e0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
119f0 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
11a00 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
11a10 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
11a20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
11a30 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
11a40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11a50 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11a60 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
11a70 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
11a80 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
11a90 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
11aa0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
11ab0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
11ac0 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
11ad0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
11ae0 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
11af0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11b00 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11b10 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
11b20 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
11b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
11b40 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11b50 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
11b60 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
11b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
11ba0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
11bb0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
11bc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11bd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11be0 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
11bf0 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
11c00 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
11c10 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
11c20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
11c30 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
11c40 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
11c50 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
11c60 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
11c70 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
11c80 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
11c90 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
11ca0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
11cb0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
11cc0 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
11cd0 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
11ce0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11cf0 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
11d00 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
11d10 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
11d20 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
11d30 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
11d40 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
11d50 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
11d60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
11d70 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
11d80 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
11d90 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
11da0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
11db0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11dc0 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
11dd0 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
11de0 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69 74   to 512 if.** it
11df0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 35 31   is less than 51
11e00 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
11e10 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
11e20 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
11e30 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
11e40 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
11e50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11e60 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
11e70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11e80 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
11e90 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
11ea0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
11eb0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
11ec0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
11ed0 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
11ee0 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
11ef0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
11f00 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
11f10 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
11f20 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
11f30 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
11f40 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
11f50 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
11f60 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
11f70 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
11f80 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
11f90 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
11fa0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
11fb0 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
11fc0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
11fd0 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
11fe0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
11ff0 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28  = 512;.  }.  if(
12000 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
12010 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
12020 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
12030 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
12040 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70  ZE>=512 );.    p
12050 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
12060 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  e = MAX_SECTOR_S
12070 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IZE;.  }.}../*.*
12080 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
12090 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
120a0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
120b0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
120c0 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
120d0 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
120e0 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
120f0 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
12100 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
12110 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
12120 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
12130 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
12140 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
12150 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
12160 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
12170 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
12180 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
12190 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
121a0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
121b0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
121c0 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
121d0 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
121e0 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
121f0 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
12200 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
12210 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
12220 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
12230 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
12240 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
12250 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
12260 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
12270 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
12280 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
12290 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
122a0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
122b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
122c0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
122d0 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
122e0 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
122f0 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
12300 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
12310 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
12320 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
12330 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
12340 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
12350 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
12360 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
12370 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
12380 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12390 20 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a   the page case..
123a0 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20  **  (7)  4 byte 
123b0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
123c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
123d0 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
123e0 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
123f0 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
12400 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
12410 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
12420 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
12430 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
12440 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e  nal.).**  (8)  N
12450 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
12460 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
12470 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
12480 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
12490 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
124a0 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
124b0 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
124c0 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
124d0 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
124e0 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
124f0 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
12500 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
12510 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
12520 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
12530 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
12540 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
12550 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20  UTF-8..**  (9)  
12560 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
12570 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
12580 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
12590 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
125a0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
125b0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
125c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
125d0 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
125e0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
125f0 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
12600 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
12610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
12620 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
12630 20 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61   first 8 items a
12640 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
12650 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
12660 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
12670 65 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65  e of the 9th ite
12680 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
12690 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
126a0 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
126b0 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
126c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
126d0 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
126e0 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
126f0 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
12700 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
12710 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
12720 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
12730 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
12740 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
12750 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
12760 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
12770 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
12780 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
12790 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
127a0 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
127b0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
127c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
127d0 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
127e0 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
127f0 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
12800 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
12810 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
12820 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
12830 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
12840 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
12850 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
12860 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
12870 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
12880 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
12890 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
128a0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
128b0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
128c0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
128d0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
128e0 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
128f0 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
12900 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
12910 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
12920 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
12930 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
12940 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
12950 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
12960 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
12970 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
12980 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
12990 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
129a0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
129b0 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
129c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
129d0 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
129e0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
129f0 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
12a00 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
12a10 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
12a20 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
12a30 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
12a40 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
12a50 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
12a60 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
12a70 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
12a80 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
12a90 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
12aa0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
12ab0 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
12ac0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
12ad0 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
12ae0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
12af0 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
12b00 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
12b10 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
12b20 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
12b30 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
12b40 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
12b50 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
12b60 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
12b70 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
12b80 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
12b90 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
12ba0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
12bb0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
12bc0 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
12bd0 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
12be0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
12bf0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
12c00 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
12c10 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
12c20 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
12c30 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
12c40 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
12c50 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
12c60 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
12c70 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
12c80 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
12c90 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12ca0 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
12cb0 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
12cc0 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
12cd0 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
12ce0 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
12cf0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
12d00 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
12d10 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
12d20 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
12d30 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
12d40 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
12d50 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
12d60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
12d70 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
12d80 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12da0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
12db0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
12dc0 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
12dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12de0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
12df0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
12e00 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
12e30 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12e40 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
12e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12e60 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
12e70 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
12e80 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ea0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
12eb0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
12ec0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
12ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
12ee0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
12ef0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
12f00 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
12f10 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
12f20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
12f30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
12f40 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
12f50 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
12f60 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
12f70 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
12f80 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
12f90 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20  llback */..  /* 
12fa0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
12fb0 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
12fc0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
12fd0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
12fe0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
12ff0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
13000 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
13010 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
13020 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
13030 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
13040 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
13050 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13060 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
13070 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
13080 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
13090 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
130a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
130b0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
130c0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
130d0 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
130e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
130f0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
13100 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
13110 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
13120 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
13130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13140 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
13150 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
13160 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
13170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
13180 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
13190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
131a0 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
131b0 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
131c0 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
131d0 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
131e0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
131f0 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
13200 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
13210 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13220 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
13230 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
13240 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
13250 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
13260 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
13270 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
13280 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
13290 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
132a0 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
132b0 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
132c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
132d0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
132e0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
132f0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
13300 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
13310 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
13320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13330 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
13340 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13350 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
13360 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
13370 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
13380 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
13390 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
133a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
133b0 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
133c0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
133d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
133e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
133f0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13400 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
13410 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
13420 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
13430 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
13440 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
13450 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
13460 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
13470 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
13480 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
13490 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
134a0 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
134b0 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63      int isUnsync
134c0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
134d0 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
134e0 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
134f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13500 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
13510 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
13520 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
13530 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13540 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
13550 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
13560 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
13570 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
13580 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
13590 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
135a0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
135b0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
135c0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
135d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
135e0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
135f0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
13600 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
13610 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
13620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13630 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
13640 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
13650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
13660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
13670 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
13680 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
13690 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
136a0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
136b0 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
136c0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
136d0 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
136e0 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
136f0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
13700 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
13710 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
13720 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
13730 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
13740 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
13750 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
13760 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
13770 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
13780 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
13790 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
137a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
137b0 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
137c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
137d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
137e0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
137f0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
13800 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
13810 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
13820 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
13830 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
13840 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
13850 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
13860 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
13870 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
13880 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
13890 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
138a0 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
138b0 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
138c0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
138d0 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
138e0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
138f0 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
13900 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13910 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
13920 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
13930 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
13940 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
13950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
13960 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
13970 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
13980 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
13990 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
139a0 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
139b0 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
139c0 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
139d0 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
139e0 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
139f0 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
13a00 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
13a10 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
13a20 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
13a30 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
13a40 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
13a50 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
13a60 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
13a70 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
13a80 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
13a90 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
13aa0 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
13ab0 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
13ac0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
13ad0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
13ae0 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
13af0 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
13b00 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
13b10 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
13b20 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
13b30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
13b40 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
13b50 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
13b60 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
13b70 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
13b80 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63      */.    testc
13b90 61 73 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20  ase( nRec==0 && 
13ba0 21 69 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20  !isHot.         
13bb0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
13bc0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
13bd0 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
13be0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13bf0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
13c00 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
13c10 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
13c20 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
13c30 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
13c40 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
13c50 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
13c60 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  er).    );.    i
13c70 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
13c80 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
13c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13ca0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
13cb0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
13cc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
13cd0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
13ce0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
13cf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
13d00 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
13d10 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69  Pager));.      i
13d20 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20  sUnsync = 1;.   
13d30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
13d40 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
13d50 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
13d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
13d70 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
13d80 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
13d90 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
13da0 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
13db0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
13dc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
13dd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13de0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
13df0 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
13e00 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
13e10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13e30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13e40 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
13e50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
13e60 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
13e70 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
13e80 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
13e90 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13ea0 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
13eb0 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
13ec0 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
13ed0 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
13ee0 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
13ef0 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
13f00 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
13f10 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
13f20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
13f30 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
13f40 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
13f50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
13f60 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
13f70 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
13f80 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c  ager,1,isUnsync,
13f90 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
13fa0 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  Off,0,0);.      
13fb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13fc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
13fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13ff0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14000 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14010 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
14020 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14030 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
14040 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
14050 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
14060 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
14070 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
14080 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
14090 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
140a0 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
140b0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
140c0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
140d0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
140e0 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
140f0 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
14100 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
14110 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
14120 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
14130 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
14140 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
14150 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
14160 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14170 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
14180 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
14190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
141a0 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
141b0 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
141c0 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
141d0 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
141e0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
141f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
14200 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
14210 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
14220 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
14230 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
14240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
14250 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
14260 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
14270 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
14280 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
14290 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
142a0 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
142b0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
142c0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
142d0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
142e0 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61   assert(.    pPa
142f0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14300 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69  s==0 ||.    sqli
14310 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
14320 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
14330 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
14340 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45  ANGED,0)>=SQLITE
14350 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  _OK.  );..  /* I
14360 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
14370 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
14380 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
14390 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
143a0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
143b0 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
143c0 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
143d0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
143e0 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
143f0 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
14400 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
14410 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
14420 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
14430 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
14440 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
14450 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
14460 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
14470 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
14480 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
14490 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
144a0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
144b0 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
144c0 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
144d0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
144e0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
144f0 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
14500 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
14510 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
14520 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
14530 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
14540 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
14550 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
14560 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
14570 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
14580 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
14590 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
145a0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
145b0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
145c0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
145d0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
145e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
145f0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
14600 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14610 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
14620 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
14630 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
14640 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
14650 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
14660 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14670 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
14680 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
146a0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
146b0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
146c0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
146d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
146e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
146f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
14700 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
14710 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
14720 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14730 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
14740 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
14750 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
14760 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
14770 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
14780 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
14790 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
147a0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
147b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
147c0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
147d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
147e0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
147f0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
14800 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
14810 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
14820 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
14830 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
14840 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
14850 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
14860 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
14870 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
14880 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
14890 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
148a0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
148b0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
148c0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
148d0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
148e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
148f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
14900 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
14910 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
14920 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
14930 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
14940 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
14950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14960 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
14970 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
14980 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
14990 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
149a0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
149b0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
149c0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
149d0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
149e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
149f0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
14a00 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
14a10 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
14a20 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
14a30 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
14a40 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
14a50 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
14a60 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
14a70 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
14a80 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
14a90 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
14aa0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
14ab0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
14ac0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ad0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
14ae0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
14af0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14b00 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
14b10 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
14b20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
14b30 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
14b40 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14b50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
14b60 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
14b70 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14b80 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
14b90 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
14ba0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14bb0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
14bc0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
14bd0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
14be0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
14bf0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14c00 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
14c10 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
14c20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
14c30 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
14c40 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14c50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
14c60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
14c70 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
14c80 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14c90 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
14ca0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
14cb0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
14cc0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
14cd0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
14ce0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
14cf0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
14d00 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
14d10 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
14d20 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
14d30 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
14d40 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
14d50 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
14d60 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
14d70 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
14d80 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
14d90 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
14da0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
14db0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
14dc0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
14dd0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
14de0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
14df0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
14e00 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
14e10 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
14e20 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
14e30 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
14e40 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
14e50 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
14e60 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14e70 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
14e80 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
14e90 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
14ea0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
14eb0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
14ec0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
14ed0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
14ee0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
14ef0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
14f00 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
14f10 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
14f20 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
14f30 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
14f40 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
14f50 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
14f60 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
14f70 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
14f80 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
14f90 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
14fa0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
14fb0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
14fc0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
14fd0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
14fe0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
14ff0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
15000 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
15010 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
15040 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
15050 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
15060 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
15070 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
15080 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
15090 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
150a0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
150b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
150c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
150d0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
150e0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
150f0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
15100 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
15110 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
15120 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
15130 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
15140 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
15150 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
15160 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
15170 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
15180 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
15190 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
151a0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
151b0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
151c0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
151d0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
151e0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
151f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15200 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
15210 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
15220 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15230 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
15240 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
15250 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
15260 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
15270 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
15280 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
15290 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
152a0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
152b0 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
152c0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f  dbOrigSize;..  /
152d0 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
152e0 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
152f0 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
15300 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
15310 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
15320 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
15330 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
15340 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
15350 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
15360 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
15370 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
15380 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
15390 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
153a0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
153b0 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
153c0 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
153d0 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
153e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
153f0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
15400 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15410 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
15420 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
15430 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
15440 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
15450 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
15460 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
15470 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
15480 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
15490 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
154a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
154b0 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
154c0 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
154d0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
154e0 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
154f0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
15500 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
15510 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
15520 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
15530 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
15540 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
15550 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
15560 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
15570 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
15580 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
15590 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
155a0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
155b0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
155c0 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
155d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
155e0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
155f0 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
15600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15620 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
15630 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15640 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15650 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
15660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15670 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
15680 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15690 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
156a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
156b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
156c0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
156d0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
156e0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
156f0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
15700 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
15710 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
15720 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
15730 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
15740 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
15750 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
15760 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
15770 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
15780 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
15790 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
157a0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
157b0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
157c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
157d0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
157e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
157f0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
15800 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
15810 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
15820 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15830 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
15840 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
15850 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
15860 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
15870 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
15880 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
15890 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
158a0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
158b0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
158c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
158d0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
158e0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
158f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
15900 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
15910 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
15920 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
15930 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
15940 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
15950 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
15960 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
15970 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
15980 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
15990 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
159a0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
159b0 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52     assert( !(nJR
159c0 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ec==0.         &
159d0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
159e0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
159f0 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61  _SZ(pPager)!=pPa
15a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
15a10 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a           && ((sz
15a20 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
15a30 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
15a40 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15a50 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  >0.         && p
15a60 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
15a70 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65  ageIsValid(pPage
15a80 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  r)).    );.    i
15a90 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
15aa0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15ab0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15ac0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
15ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15ae0 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
15af0 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
15b00 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15b10 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
15b20 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
15b30 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
15b40 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
15b50 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
15b60 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15b70 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
15b80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
15b90 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
15ba0 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30  age(pPager, 1, 0
15bb0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
15bc0 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29  alOff, 1, pDone)
15bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15be0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15bf0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
15c00 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15c10 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
15c20 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b  urnalOff==szJ );
15c30 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
15c40 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
15c50 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
15c60 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
15c70 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
15c80 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
15c90 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
15ca0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
15cb0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
15cc0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
15cd0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
15ce0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
15cf0 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
15d00 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
15d10 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
15d20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
15d30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15d40 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
15d50 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
15d60 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
15d70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
15d80 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
15d90 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
15da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
15db0 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
15dc0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
15dd0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
15de0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
15df0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
15e00 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
15e10 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
15e20 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66 73  ger, 0, 0, &offs
15e30 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  et, 1, pDone);. 
15e40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15e60 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
15e70 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
15e80 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
15e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15ea0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15eb0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
15ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15ed0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ee0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
15ef0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
15f00 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
15f10 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
15f20 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15f30 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
15f40 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
15f50 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
15f60 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
15f70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
15f80 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
15f90 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
15fa0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
15fb0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
15fc0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
15fd0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
15fe0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
15ff0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
16000 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
16010 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
16020 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16030 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
16040 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
16050 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
16060 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
16070 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
16080 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
16090 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
160a0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
160b0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
160c0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
160d0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
160e0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
160f0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
16100 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
16110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16120 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
16130 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
16140 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
16150 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
16160 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
16170 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
16180 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
16190 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
161a0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
161b0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
161c0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
161d0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
161e0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
161f0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
16200 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
16210 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
16220 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
16230 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
16240 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
16250 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
16260 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
16270 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
16280 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
16290 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
162a0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
162b0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
162c0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
162d0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
162e0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
162f0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
16300 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
16310 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
16320 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
16340 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
16350 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
16360 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
16370 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
16380 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
16390 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
163a0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
163b0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
163c0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
163d0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
163e0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
163f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16400 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
16410 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
16420 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
16430 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
16440 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
16450 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
16460 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
16470 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
16480 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
16490 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
164a0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
164b0 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
164c0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
164d0 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
164e0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
164f0 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a  nt bFullFsync){.
16500 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
16510 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
16520 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
16530 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
16540 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
16550 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
16560 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
16570 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :0;.  pPager->sy
16580 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
16590 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
165a0 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
165b0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
165c0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
165d0 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
165e0 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
165f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
16600 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
16610 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
16620 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
16630 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
16640 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
16650 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
16660 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
16670 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
16680 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
16690 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
166a0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
166b0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
166c0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
166d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
166e0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
166f0 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
16700 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
16710 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
16720 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
16730 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
16740 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
16750 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
16760 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
16770 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
16780 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
16790 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
167a0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
167b0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
167c0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
167d0 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
167e0 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
167f0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
16800 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
16810 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
16820 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
16830 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
16840 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16850 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
16860 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
16870 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16880 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
16890 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
168a0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
168b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
168c0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
168d0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
168e0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
168f0 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
16900 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
16910 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16920 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
16930 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
16940 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
16950 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
16960 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
16970 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16990 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
169a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
169b0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
169c0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
169d0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
169e0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
169f0 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
16a00 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
16a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16a20 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16a30 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
16a40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16a50 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
16a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
16a70 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
16a80 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
16a90 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
16aa0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
16ab0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
16ac0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
16ad0 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
16ae0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16af0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
16b00 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
16b10 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
16b20 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
16b30 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
16b40 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
16b50 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
16b60 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
16b70 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
16b80 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
16b90 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
16ba0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
16bb0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
16bc0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
16bd0 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
16be0 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
16bf0 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
16c00 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
16c10 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
16c20 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
16c30 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
16c40 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
16c50 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
16c60 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
16c70 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
16c80 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
16c90 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
16ca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
16cb0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
16cd0 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
16ce0 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
16cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
16d30 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
16d40 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
16d50 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
16d60 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
16d70 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
16d80 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16d90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
16da0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
16db0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
16dc0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
16dd0 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
16de0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
16df0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
16e00 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
16e10 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
16e20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
16e30 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
16e40 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
16e50 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
16e60 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
16e70 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
16e80 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
16e90 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
16ea0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
16eb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
16ee0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
16ef0 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
16f00 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
16f10 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
16f20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
16f30 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
16f40 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
16f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
16f60 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
16f70 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
16f80 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d  /.){  .  pPager-
16f90 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
16fa0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
16fb0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
16fc0 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
16fd0 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a  andlerArg;.}../*
16fe0 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
16ff0 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
17000 69 73 20 70 61 67 65 72 2e 20 49 66 20 6e 6f 74  is pager. If not
17010 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
17020 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
17030 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
17040 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
17050 20 69 6e 20 63 61 63 68 65 20 69 73 20 6d 6f 64   in cache is mod
17060 69 66 69 65 64 20 28 72 65 73 74 6f 72 65 64 29  ified (restored)
17070 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61  .** as part of a
17080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
17090 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
170a0 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  ck. The callback
170b0 20 67 69 76 65 73 20 0a 2a 2a 20 68 69 67 68 65   gives .** highe
170c0 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20 61 6e 20  r-level code an 
170d0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
170e0 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
170f0 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20   section to .** 
17100 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
17110 65 73 74 6f 72 65 64 20 70 61 67 65 20 64 61 74  estored page dat
17120 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
17130 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
17140 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
17150 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74  , void (*xReinit
17160 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70  )(DbPage*)){.  p
17170 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
17180 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
17190 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
171a0 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
171b0 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
171c0 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
171d0 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
171e0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
171f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17200 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
17210 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
17220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
17230 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
17240 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
17250 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
17260 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
17270 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
17280 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
17290 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
172a0 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
172b0 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
172c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
172d0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
172e0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
172f0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
17300 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
17310 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
17320 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
17330 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
17340 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
17350 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
17360 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
17370 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
17380 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
17390 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
173a0 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
173b0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
173c0 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
173d0 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
173e0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
173f0 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
17400 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17410 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
17420 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
17430 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
17440 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
17450 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
17460 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
17470 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
17480 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
17490 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
174a0 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
174b0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
174c0 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
174d0 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
174e0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
174f0 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
17500 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
17510 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17520 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
17530 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
17540 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
17550 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
17560 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
17570 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17580 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
17590 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
175a0 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
175b0 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
175c0 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
175d0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
175e0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
175f0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
17600 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
17610 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
17620 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
17630 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
17640 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
17650 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
17660 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
17670 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
17680 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
17690 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
176a0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
176b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
176c0 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
176d0 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
176e0 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74  PageSize){.  int
176f0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17700 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d  rCode;.  if( rc=
17710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17720 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
17730 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
17740 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
17750 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
17760 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
17770 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
17780 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
17790 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26   if( pageSize &&
177a0 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
177b0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
177c0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65    && (pPager->me
177d0 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
177e0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
177f0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
17800 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
17810 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
17820 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
17830 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
17840 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
17850 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
17860 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
17870 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17880 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
178a0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
178b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
178c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
178d0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
178e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
178f0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
17900 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
17910 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
17920 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
17930 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
17940 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
17950 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
17960 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
17970 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53     }.    *pPageS
17980 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65  ize = (u16)pPage
17990 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
179a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
179b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
179c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
179d0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
179e0 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
179f0 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
17a00 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
17a10 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
17a20 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
17a30 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
17a40 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
17a50 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
17a60 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
17a70 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
17a80 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
17a90 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
17aa0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
17ab0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
17ac0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
17ad0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
17ae0 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
17af0 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
17b00 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
17b10 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
17b20 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
17b30 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
17b40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
17b50 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
17b60 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
17b70 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
17b80 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
17b90 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
17ba0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
17bb0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
17bc0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
17bd0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
17be0 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
17bf0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
17c00 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
17c10 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
17c20 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
17c30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17c40 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
17c50 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
17c60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
17c70 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17c80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17c90 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
17ca0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17cb0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
17cc0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
17cd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
17ce0 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
17cf0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
17d00 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
17d10 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
17d20 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
17d30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
17d40 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
17d50 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
17d60 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
17d70 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
17d80 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
17d90 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
17da0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
17db0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
17dc0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
17dd0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
17de0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
17df0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
17e00 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
17e10 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
17e20 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
17e30 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
17e40 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
17e50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17e60 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
17e70 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
17e80 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
17e90 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17ea0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
17eb0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
17ec0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
17ed0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
17ee0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
17ef0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
17f00 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
17f10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
17f20 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
17f30 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
17f40 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
17f50 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
17f60 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
17f70 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
17f80 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
17f90 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
17fa0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17fb0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
17fc0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17fd0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
17fe0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
17ff0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
18000 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
18010 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
18020 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
18030 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
18040 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
18050 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
18060 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
18070 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
18080 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
18090 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
180a0 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
180b0 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
180c0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
180d0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
180e0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
180f0 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
18100 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
18110 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
18120 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
18130 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
18140 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
18150 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
18160 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
18170 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
18180 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
18190 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
181a0 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
181b0 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
181c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
181d0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
181e0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
181f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
18200 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
18210 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
18220 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
18230 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
18240 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
18250 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
18260 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
18270 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
18280 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
18290 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
182a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
182b0 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
182c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
182d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
182e0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
182f0 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ile );.  if( isO
18300 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18310 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
18320 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
18330 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
18340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18350 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
18360 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
18370 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18380 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
18390 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
183a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
183b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
183c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
183d0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
183e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
183f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18400 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  le associated .*
18410 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e  * with pPager. N
18420 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  ormally, this is
18430 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28   calculated as (
18440 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c  <db file size>/<
18450 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20  page-size>)..** 
18460 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
18470 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
18480 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
18490 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
184a0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
184b0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
184c0 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   page file..**.*
184d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
184e0 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
184f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
18500 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
18510 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  hen the.** error
18520 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
18530 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18540 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75  d *pnPage left u
18550 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a  nchanged. Or,.**
18560 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73   if the file sys
18570 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75  tem has to be qu
18580 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69  eried for the si
18590 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  ze of the file a
185a0 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20  nd.** the query 
185b0 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20  attempt returns 
185c0 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65  an IO error, the
185d0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
185e0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
185f0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
18600 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
18610 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
18620 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
18630 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
18640 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18650 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e  urned.** and *pn
18660 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74  Page is set to t
18670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18680 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
18690 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
186a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
186b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
186c0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
186d0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
186e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
186f0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
18700 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
18710 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
18720 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
18730 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
18740 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
18750 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ode. */.  if( pP
18760 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
18770 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
18780 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
18790 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
187a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
187b0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
187c0 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20  . Store this in 
187d0 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  nPage. */.  if( 
187e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
187f0 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  lid ){.    nPage
18800 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
18810 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
18820 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18830 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
18840 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
18850 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20  ileSize() */.   
18860 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
18870 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
18880 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72   size in bytes r
18890 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
188a0 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20  eSize() */..    
188b0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
188c0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
188d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
188e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
188f0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20  (pPager->fd) && 
18900 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
18910 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
18920 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20  ager->fd, &n))) 
18930 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
18940 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
18950 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18960 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
18970 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
18980 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
18990 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
189a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189b0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
189c0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
189d0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
189e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
189f0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18a00 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18a10 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
18a20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18a30 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
18a40 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
18a50 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31  >dbSizeValid = 1
18a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18a70 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
18a80 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18a90 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
18aa0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
18ab0 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65   .  ** configure
18ac0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
18ad0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
18ae0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
18af0 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
18b00 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
18b10 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
18b20 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
18b30 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
18b40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
18b50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
18b60 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
18b70 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64  put variable and
18b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b90 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67  K */.  if( pnPag
18ba0 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65  e ){.    *pnPage
18bb0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
18bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18bd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
18be0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
18bf0 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
18c00 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
18c10 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
18c20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
18c30 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
18c40 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
18c50 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
18c60 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
18c70 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
18c80 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
18c90 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
18ca0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
18cb0 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
18cc0 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
18cd0 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
18ce0 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
18cf0 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
18d00 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
18d10 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
18d20 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
18d30 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
18d40 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
18d50 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
18d60 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
18d70 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
18d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18d90 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
18da0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
18db0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
18dc0 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
18dd0 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
18de0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
18df0 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
18e00 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
18e10 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
18e20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18e30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18e40 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
18e50 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
18e60 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
18e70 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18ea0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
18eb0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
18ec0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
18ed0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
18ee0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
18ef0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
18f00 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
18f10 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18f20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
18f30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
18f40 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
18f50 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
18f60 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
18f70 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
18f80 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
18f90 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
18fa0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
18fb0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
18fc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18fd0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
18fe0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
18ff0 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  lid==0 );..  /* 
19000 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
19010 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
19020 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
19030 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
19040 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
19050 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
19060 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
19070 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
19080 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
19090 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
190a0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
190b0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
190c0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
190d0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
190e0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
190f0 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
19100 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  e>=locktype).   
19110 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
19120 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19130 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
19140 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
19150 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
19160 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
19170 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74  ESERVED && lockt
19180 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55  ype==PAGER_EXCLU
19190 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66  SIVE).  );..  if
191a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
191b0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
191c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
191d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
191e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
191f0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
19200 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
19210 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
19220 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
19230 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
19240 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
19250 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
19260 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19280 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
19290 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
192a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
192b0 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
192c0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
192d0 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
192e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
192f0 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
19300 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19310 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
19320 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
19330 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
19340 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
19350 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
19360 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
19370 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
19380 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
19390 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
193a0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
193b0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
193c0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
193d0 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
193e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
193f0 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
19400 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
19410 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
19420 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19430 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
19440 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19450 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
19460 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
19470 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
19480 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19490 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
194a0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
194b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
194c0 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  age;.}../*.** Sh
194d0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
194e0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
194f0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
19500 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
19510 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
19520 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
19530 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
19540 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
19550 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
19560 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
19570 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
19580 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
19590 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
195a0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
195b0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
195c0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
195d0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
195e0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
195f0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
19600 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19610 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
19620 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
19630 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
19640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
19650 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
19660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19670 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
19680 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
19690 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
196a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
196b0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
196c0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
196d0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
196e0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
196f0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
19700 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
19710 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
19720 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19730 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
19740 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73   *pPager){.  dis
19750 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
19760 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
19770 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
19780 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67  Malloc();.  pPag
19790 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
197a0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
197b0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
197c0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
197d0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
197e0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
197f0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
19800 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
19810 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
19820 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
19830 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
19840 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
19850 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
19860 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
19870 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
19880 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
19890 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
198a0 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
198b0 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
198c0 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
198d0 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
198e0 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
198f0 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
19900 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
19910 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
19920 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
19930 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
19940 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
19950 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
19960 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
19970 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19980 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  alHdr = -1;.    
19990 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
199a0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
199b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
199c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
199d0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
199e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
199f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
19a00 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
19a10 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
19a20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
19a30 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
19a40 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
19a50 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
19a60 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
19a70 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
19a80 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
19a90 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
19aa0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 61  ->pPCache);..  a
19ab0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
19ac0 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
19ad0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
19ae0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
19af0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
19b00 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
19b10 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
19b20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19b30 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
19b40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19b50 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
19b60 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
19b70 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
19b80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
19b90 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
19ba0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
19bb0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19bc0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
19bd0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
19be0 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
19bf0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
19c00 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
19c10 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
19c20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
19c30 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
19c40 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
19c50 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
19c60 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
19c70 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
19c80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
19c90 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
19ca0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
19cb0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
19cc0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
19cd0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
19ce0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
19cf0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
19d00 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
19d10 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
19d20 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
19d30 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
19d40 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
19d50 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
19d60 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74   not set, then t
19d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19d80 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  a.** no-op. Othe
19d90 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
19da0 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
19db0 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
19dc0 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68  l-mode.** and th
19dd0 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
19de0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
19df0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
19e00 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
19e10 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
19e20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
19e30 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
19e40 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
19e50 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
19e60 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
19e70 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
19e80 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
19e90 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
19ea0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
19eb0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
19ec0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
19ed0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
19ee0 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
19ef0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
19f00 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
19f10 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
19f20 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
19f30 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
19f40 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
19f50 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
19f60 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
19f70 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
19f80 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
19f90 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
19fa0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
19fb0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
19fc0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
19fd0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
19fe0 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
19ff0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1a000 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
1a010 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
1a020 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
1a030 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
1a040 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
1a050 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
1a060 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
1a070 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
1a080 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
1a090 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
1a0a0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
1a0b0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
1a0c0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1a0d0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
1a0e0 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
1a0f0 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
1a100 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
1a110 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
1a120 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
1a130 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50     }.**.** The P
1a140 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1a150 61 67 20 69 73 20 6e 65 76 65 72 20 62 65 20 73  ag is never be s
1a160 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  et for temporary
1a170 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a   files, or any.*
1a180 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67  * file operating
1a190 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1a1a0 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73   (Pager.noSync s
1a1b0 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e  et to non-zero).
1a1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1a1d0 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
1a1e0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
1a1f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
1a200 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
1a210 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
1a220 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
1a230 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
1a240 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
1a250 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
1a260 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
1a270 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1a280 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1a290 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
1a2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
1a2b0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
1a2c0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
1a2d0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1a2e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1a2f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a300 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1a310 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1a320 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1a330 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
1a340 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a370 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63   code */.      c
1a380 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
1a390 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a3a0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a3b0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1a3c0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1a3d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1a3e0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1a3f0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1a400 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
1a410 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61          /* Varia
1a420 62 6c 65 20 69 4e 52 65 63 4f 66 66 73 65 74 20  ble iNRecOffset 
1a430 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
1a440 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
1a450 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  nal file.       
1a460 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52 65 63 20   ** of the nRec 
1a470 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
1a480 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
1a490 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
1a4a0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  r..        ** Th
1a4b0 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65  is field will be
1a4c0 20 75 70 64 61 74 65 64 20 66 6f 6c 6c 6f 77 69   updated followi
1a4d0 6e 67 20 74 68 65 20 78 53 79 6e 63 28 29 20 6f  ng the xSync() o
1a4e0 70 65 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  peration.       
1a4f0 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
1a500 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1a510 20 20 20 20 69 36 34 20 69 4e 52 65 63 4f 66 66      i64 iNRecOff
1a520 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
1a530 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
1a540 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1a550 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1a560 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
1a570 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
1a580 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
1a590 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
1a5a0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1a5b0 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
1a5c0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
1a5d0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
1a5e0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
1a5f0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1a600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a610 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
1a620 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
1a630 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
1a640 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
1a650 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
1a660 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
1a670 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
1a680 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
1a690 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
1a6a0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
1a6b0 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
1a6c0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1a6d0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
1a6e0 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f  tions transactio
1a6f0 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
1a700 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
1a710 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
1a720 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
1a730 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
1a740 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
1a750 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
1a760 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
1a770 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
1a780 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
1a790 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
1a7a0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
1a7b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
1a7c0 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
1a7d0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
1a7e0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
1a7f0 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
1a800 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
1a810 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
1a820 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
1a830 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
1a840 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
1a850 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
1a860 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
1a870 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
1a880 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
1a890 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
1a8a0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
1a8b0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1a8c0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
1a8d0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
1a8e0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
1a8f0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
1a900 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
1a910 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
1a920 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
1a930 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
1a940 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
1a950 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
1a960 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
1a970 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
1a980 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
1a990 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
1a9a0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
1a9b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1a9c0 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
1a9d0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
1a9e0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
1a9f0 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
1aa00 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
1aa10 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
1aa20 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
1aa30 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
1aa40 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
1aa50 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
1aa60 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
1aa70 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
1aa80 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
1aa90 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
1aaa0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
1aab0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
1aac0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
1aad0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
1aae0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
1aaf0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1ab00 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
1ab10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ab20 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1ab30 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
1ab40 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
1ab50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
1ab70 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
1ab80 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1ab90 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
1aba0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1abb0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
1abc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1abd0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1abe0 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
1abf0 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
1ac00 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
1ac10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1ac20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1ac30 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1ac40 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1ac50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ac60 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1ac70 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1ac80 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1ac90 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1aca0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
1acb0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
1acc0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
1acd0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
1ace0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
1acf0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
1ad00 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
1ad10 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
1ad20 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
1ad30 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
1ad40 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
1ad50 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
1ad60 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
1ad70 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
1ad80 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
1ad90 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
1ada0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
1adb0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
1adc0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
1add0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1ade0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
1adf0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1ae00 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
1ae10 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
1ae20 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
1ae30 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1ae40 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
1ae50 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
1ae60 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
1ae70 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
1ae80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
1ae90 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
1aea0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
1aeb0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
1aec0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
1aed0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1aee0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1aef0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
1af00 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1af10 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
1af20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1af30 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
1af40 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1af50 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
1af60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1af70 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1af80 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
1af90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1afa0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1afb0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1afc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1afd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1afe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1aff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
1b000 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
1b010 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
1b020 65 72 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c  er, iNRecOffset,
1b030 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
1b040 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1b050 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4e 52 65  Pager->jfd, iNRe
1b060 63 4f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d  cOffset, pPager-
1b070 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
1b080 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b090 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b0b0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1b0c0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1b0d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
1b0e0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
1b0f0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
1b100 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b110 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
1b120 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1b130 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b150 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1b160 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1b170 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
1b180 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
1b190 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
1b1a0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
1b1b0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
1b1c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1b1d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b1e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1b1f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1b200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  ..    /* The jou
1b210 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
1b220 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  st successfully 
1b230 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65  synced. Set Page
1b240 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
1b250 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63  ** to zero and c
1b260 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
1b270 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
1b280 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20   all pagess..   
1b290 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1b2a0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1b2b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b2c0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
1b2d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
1b2e0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
1b2f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1b300 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b320 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
1b330 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1b340 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1b350 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
1b360 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
1b370 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
1b380 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
1b390 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
1b3a0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
1b3b0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
1b3c0 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
1b3d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b3e0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
1b3f0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
1b400 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
1b410 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
1b420 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
1b430 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
1b440 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
1b450 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
1b460 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
1b470 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
1b480 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
1b490 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
1b4a0 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
1b4b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b4c0 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
1b4d0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
1b4e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1b4f0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
1b500 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
1b510 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
1b520 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
1b530 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
1b540 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
1b550 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
1b560 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1b570 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
1b580 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
1b590 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
1b5a0 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
1b5b0 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
1b5c0 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
1b5d0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1b5e0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
1b5f0 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
1b600 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
1b610 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
1b620 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
1b630 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
1b640 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
1b650 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
1b660 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b670 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
1b680 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
1b690 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
1b6a0 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
1b6b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b6c0 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
1b6d0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
1b6e0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
1b6f0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1b700 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
1b710 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1b720 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
1b730 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
1b740 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
1b750 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
1b760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b770 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
1b780 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
1b790 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
1b7a0 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
1b7b0 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
1b7c0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
1b7d0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
1b7e0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1b7f0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
1b800 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
1b810 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
1b820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b830 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
1b840 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1b850 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1b860 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1b870 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
1b880 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
1b890 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1b8a0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
1b8b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
1b8c0 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
1b8d0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
1b8e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1b8f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1b900 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1b910 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
1b920 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1b950 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1b960 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b990 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  */..  if( pList=
1b9a0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b9b0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
1b9c0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
1b9d0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
1b9e0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
1b9f0 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
1ba00 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
1ba10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
1ba20 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1ba30 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
1ba40 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
1ba50 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
1ba60 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20  owing.  ** call 
1ba70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
1ba80 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
1ba90 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
1baa0 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
1bab0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
1bac0 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
1bad0 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
1bae0 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
1baf0 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
1bb00 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
1bb10 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
1bb20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
1bb30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
1bb40 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
1bb50 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
1bb60 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
1bb70 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
1bb80 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
1bb90 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
1bba0 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
1bbb0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
1bbc0 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
1bbd0 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
1bbe0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
1bbf0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
1bc00 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
1bc10 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
1bc20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1bc30 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
1bc40 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
1bc50 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1bc60 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
1bc70 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
1bc80 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1bc90 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1bca0 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
1bcb0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
1bcc0 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
1bcd0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1bce0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
1bcf0 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
1bd00 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
1bd10 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
1bd20 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
1bd30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bd40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1bd50 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63  RESERVED );.  rc
1bd60 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1bd70 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1bd80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a  CLUSIVE_LOCK);..
1bd90 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1bda0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
1bdb0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1bdc0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1bdd0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
1bde0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
1bdf0 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
1be00 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
1be10 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
1be20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
1be30 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1be40 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1be50 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
1be60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
1be70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1be80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1be90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1bea0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1beb0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1bec0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
1bed0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
1bee0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
1bef0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1bf00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bf10 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
1bf20 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
1bf30 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
1bf40 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
1bf50 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
1bf60 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
1bf70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1bf80 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
1bf90 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
1bfa0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
1bfb0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1bfc0 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
1bfd0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
1bfe0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
1bff0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
1c000 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
1c010 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
1c020 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
1c030 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
1c040 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c050 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
1c060 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
1c070 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
1c080 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1c090 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
1c0a0 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
1c0b0 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
1c0c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c0d0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
1c0e0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
1c0f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
1c100 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
1c110 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c120 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1c130 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1c140 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1c150 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1c160 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
1c170 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1c180 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
1c190 67 6e 6f 2c 20 36 29 3b 20 2f 2a 20 44 61 74 61  gno, 6); /* Data
1c1a0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20   to write */..  
1c1b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
1c1c0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
1c1d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1c1e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c1f0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
1c200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c210 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
1c220 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
1c230 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
1c240 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
1c250 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
1c260 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
1c270 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
1c280 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c290 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
1c2a0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
1c2b0 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
1c2c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1c2d0 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
1c2e0 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
1c2f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
1c300 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1c310 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1c320 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1c330 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1c340 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c350 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1c360 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1c370 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1c380 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1c390 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c3a0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
1c3b0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
1c3c0 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
1c3d0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
1c3e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
1c3f0 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
1c400 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1c410 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1c420 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 20 2a 29  up, pgno, (u8 *)
1c430 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
1c440 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
1c450 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
1c460 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1c480 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c490 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1c4a0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
1c4b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1c4c0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
1c4d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1c4e0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1c4f0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1c500 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
1c510 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1c520 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
1c530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c540 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
1c550 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1c560 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c570 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
1c580 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1c590 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1c5a0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
1c5b0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1c5c0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
1c5d0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
1c5e0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
1c5f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c600 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1c610 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
1c620 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1c630 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
1c640 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
1c650 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
1c660 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
1c670 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
1c680 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
1c690 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
1c6a0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
1c6b0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
1c6c0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1c6d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1c6e0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
1c6f0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1c700 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
1c710 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
1c720 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
1c730 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
1c740 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c750 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1c760 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c770 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c780 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
1c790 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
1c7a0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
1c7b0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1c7c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
1c7d0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
1c7e0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
1c7f0 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
1c800 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
1c810 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
1c820 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
1c830 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
1c840 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
1c850 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c860 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1c870 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c880 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70  ager;.  if( isOp
1c890 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
1c8a0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1c8b0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
1c8c0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
1c8d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
1c8e0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
1c8f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61  geSize);.    cha
1c900 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c910 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c920 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c930 0a 20 20 0a 20 20 20 20 50 41 47 45 52 54 52 41  .  .    PAGERTRA
1c940 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
1c950 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c960 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c970 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1c980 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61   .    assert( pa
1c990 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1c9a0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
1c9b0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1c9c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   );.    rc = wri
1c9d0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1c9e0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
1c9f0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1ca00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ca20 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1ca30 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
1ca40 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1ca50 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
1ca60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ca70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ca80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
1ca90 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
1caa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
1cab0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
1cac0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
1cad0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1cae0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1caf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1cb00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cb10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cb20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1cb30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cb40 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
1cb50 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
1cb60 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
1cb70 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
1cb80 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
1cb90 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1cba0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
1cbb0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
1cbc0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
1cbd0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
1cbe0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
1cbf0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
1cc00 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
1cc10 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cc20 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
1cc30 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
1cc40 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
1cc50 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
1cc60 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1cc70 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
1cc80 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
1cc90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1cca0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
1ccb0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1ccc0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
1ccd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
1cce0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1ccf0 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
1cd00 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
1cd10 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
1cd20 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1cd30 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
1cd40 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
1cd50 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
1cd60 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1cd70 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
1cd80 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
1cd90 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1cda0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
1cdb0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
1cdc0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
1cdd0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1cde0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1cdf0 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
1ce00 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
1ce10 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
1ce20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1ce30 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
1ce40 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
1ce50 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
1ce60 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
1ce70 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1ce80 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
1ce90 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1cea0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
1ceb0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1cec0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
1ced0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1cee0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
1cef0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1cf00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1cf10 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
1cf20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cf30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1cf40 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
1cf50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1cf60 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1cf70 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
1cf80 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1cf90 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1cfa0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1cfb0 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1cfc0 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e  it.  ** is journ
1cfd0 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20  alling a set of 
1cfe0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61  two or more data
1cff0 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20  base pages that 
1d000 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20  are stored.  ** 
1d010 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b  on the same disk
1d020 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67   sector. Syncing
1d030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1d040 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c  not allowed whil
1d050 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68  e.  ** this is h
1d060 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1d070 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1d080 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1d090 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20  such a.  ** set 
1d0a0 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
1d0b0 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
1d0c0 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
1d0d0 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
1d0e0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69  ion.  ** is tryi
1d0f0 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
1d100 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1d110 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
1d120 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
1d130 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
1d140 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1d150 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
1d160 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
1d170 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20   will.  ** just 
1d180 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1d190 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d1a0 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1d1b0 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
1d1c0 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a  reusing pPg..  *
1d1d0 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79  *.  ** Similarly
1d1e0 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68  , if the pager h
1d1f0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
1d200 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
1d210 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  te, do not.  ** 
1d220 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1d230 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1d240 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
1d250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1d260 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
1d270 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d280 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d290 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20  EED_SYNC) ){.   
1d2a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d2b0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e  K;.  }..  /* Syn
1d2c0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1d2d0 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
1d2e0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
1d2f0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d300 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  YNC ){.    rc = 
1d310 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1d320 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1d330 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1d340 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1d350 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65  & .      !(pPage
1d360 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1d370 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1d380 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
1d390 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
1d3a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1d3b0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
1d3c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1d3d0 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b  E_APPEND).    ){
1d3e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1d3f0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Rec = 0;.      r
1d400 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1d410 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1d420 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1d430 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1d440 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
1d450 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1d460 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1d470 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1d480 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
1d490 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
1d4a0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
1d4b0 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73  urnal..  ** This
1d4c0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1d4d0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
1d4e0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
1d4f0 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
1d500 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
1d510 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
1d520 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1d530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69  .  **.  ** Consi
1d540 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1d550 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
1d560 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents:.  **.  ** 
1d570 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
1d580 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
1d590 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  X>.  **     <mod
1d5a0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  ify page X>.  **
1d5b0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
1d5c0 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  p;.  **       <s
1d5d0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
1d5e0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
1d5f0 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
1d600 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
1d610 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
1d620 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a   TO sp;.  **.  *
1d630 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
1d640 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
1d650 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
1d660 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
1d670 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20  ritten.  ** out 
1d680 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d690 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
1d6a0 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
1d6b0 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
1d6c0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
1d6d0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
1d6e0 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
1d6f0 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
1d700 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74  ll read.  ** dat
1d710 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1d720 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
1d730 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
1d740 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
1d750 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
1d760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1d770 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
1d780 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
1d790 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61  OINT sp".  ** wa
1d7a0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
1d7b0 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  .  ** The soluti
1d7c0 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1d7d0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1d7e0 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1d7f0 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
1d800 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
1d810 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1d820 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
1d830 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a  that it will.  *
1d840 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
1d850 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
1d860 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
1d870 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
1d880 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a  .  ** executed..
1d890 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1d8a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
1d8b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1d8c0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
1d8d0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
1d8e0 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
1d8f0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
1d900 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1d910 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1d920 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
1d930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d940 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1d950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d960 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1d970 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d980 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1d990 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Pg);.  }..  /* M
1d9a0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1d9b0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
1d9c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d9d0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
1d9e0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
1d9f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1da00 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1da10 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
1da20 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1da30 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
1da40 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1da50 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1da60 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1da70 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
1da80 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
1da90 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
1daa0 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
1dab0 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
1dac0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
1dad0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
1dae0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
1daf0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1db00 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
1db10 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1db20 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
1db30 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1db40 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
1db50 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
1db60 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
1db70 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
1db80 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
1db90 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
1dba0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
1dbb0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
1dbc0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
1dbd0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
1dbe0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1dbf0 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
1dc00 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
1dc10 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
1dc20 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
1dc30 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
1dc40 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
1dc50 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
1dc60 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
1dc70 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
1dc80 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
1dc90 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1dca0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
1dcb0 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
1dcc0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
1dcd0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
1dce0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
1dcf0 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
1dd00 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
1dd10 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
1dd20 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
1dd30 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
1dd40 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
1dd50 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
1dd60 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
1dd70 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
1dd80 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
1dd90 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
1dda0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
1ddb0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
1ddc0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
1ddd0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
1dde0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
1ddf0 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
1de00 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
1de10 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
1de20 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
1de30 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
1de40 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
1de50 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
1de60 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
1de70 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
1de80 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
1de90 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
1dea0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
1deb0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1dec0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
1ded0 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
1dee0 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
1def0 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
1df00 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
1df10 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1df20 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
1df30 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
1df40 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
1df50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1df60 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
1df70 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1df80 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
1df90 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
1dfa0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
1dfb0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
1dfc0 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
1dfd0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
1dfe0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
1dff0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1e000 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
1e010 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
1e020 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
1e030 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
1e040 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e050 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
1e060 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
1e070 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
1e080 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
1e090 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e0a0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
1e0b0 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
1e0c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e0d0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
1e0e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e0f0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1e100 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
1e110 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
1e120 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
1e130 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
1e140 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1e150 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e170 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
1e180 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
1e190 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
1e1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e1b0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1e1c0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
1e1d0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
1e1e0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
1e1f0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
1e200 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e210 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
1e220 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
1e230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e240 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1e250 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e260 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
1e270 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e280 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
1e290 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
1e2a0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
1e2b0 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
1e2c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e2d0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1e2e0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
1e2f0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
1e300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e310 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
1e320 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
1e330 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
1e340 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
1e350 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e360 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1e370 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
1e380 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1e390 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
1e3a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e3b0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
1e3c0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1e3d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1e3e0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
1e3f0 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
1e400 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e410 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
1e420 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
1e430 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
1e440 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
1e450 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e460 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
1e470 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
1e480 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
1e490 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
1e4a0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
1e4b0 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
1e4c0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1e4d0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
1e4e0 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66  /.  u16 szPageDf
1e4f0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
1e500 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
1e510 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
1e520 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
1e530 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
1e540 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
1e550 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
1e560 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
1e570 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
1e580 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
1e590 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
1e5a0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
1e5b0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
1e5c0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
1e5d0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
1e5e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
1e5f0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1e600 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
1e610 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
1e620 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
1e630 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
1e640 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
1e650 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
1e660 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
1e670 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
1e680 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
1e690 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
1e6a0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
1e6b0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
1e6c0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
1e6d0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
1e6e0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
1e6f0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
1e700 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
1e710 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
1e720 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1e730 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
1e740 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1e750 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
1e760 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1e770 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e780 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1e790 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1e7a0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
1e7b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
1e7c0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
1e7d0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
1e7e0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
1e7f0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
1e800 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
1e810 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
1e820 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1e830 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
1e840 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
1e850 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
1e860 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
1e870 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
1e880 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
1e890 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
1e8a0 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
1e8b0 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
1e8c0 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
1e8d0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1e8e0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1e8f0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
1e900 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
1e910 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
1e920 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1e930 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
1e940 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
1e950 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
1e960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e970 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
1e980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e990 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
1e9a0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
1e9b0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
1e9c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
1e9d0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
1e9e0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
1e9f0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1ea00 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
1ea10 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
1ea20 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
1ea30 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
1ea40 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
1ea50 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
1ea60 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
1ea70 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
1ea80 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
1ea90 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
1eaa0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
1eab0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
1eac0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
1ead0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1eae0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
1eaf0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
1eb00 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1eb10 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
1eb20 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
1eb30 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
1eb40 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
1eb50 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1eb60 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
1eb70 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
1eb80 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1eb90 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
1eba0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
1ebb0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1ebc0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
1ebd0 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
1ebe0 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
1ebf0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
1ec00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1ec10 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
1ec20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
1ec30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
1ec40 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
1ec50 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1ec60 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1ec70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1ec80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ec90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1eca0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1ecb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ecc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ecd0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
1ece0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
1ecf0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
1ed00 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
1ed10 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
1ed20 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
1ed30 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
1ed40 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
1ed50 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
1ed60 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
1ed70 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
1ed80 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1ed90 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
1edc0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
1edd0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
1ee00 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
1ee10 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
1ee20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
1ee30 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
1ee40 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
1ee50 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
1ee60 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
1ee70 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1ee80 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1ee90 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
1eea0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1eeb0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1eec0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1eed0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1eee0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
1eef0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1ef00 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
1ef10 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
1ef20 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
1ef30 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
1ef40 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
1ef50 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
1ef60 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1ef70 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
1ef80 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
1ef90 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
1efa0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
1efb0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
1efc0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
1efd0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
1efe0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
1eff0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
1f000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
1f010 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
1f020 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1f030 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
1f040 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
1f050 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
1f060 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
1f090 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1f0a0 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  8 + 1           
1f0b0 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
1f0c0 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  /.  );.  assert(
1f0d0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1f0e0 4e 4d 45 4e 54 28 6a 6f 75 72 6e 61 6c 46 69 6c  NMENT(journalFil
1f0f0 65 53 69 7a 65 29 20 29 3b 0a 20 20 69 66 28 20  eSize) );.  if( 
1f100 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
1f110 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
1f120 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
1f130 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1f140 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
1f150 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
1f160 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
1f170 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
1f180 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
1f190 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
1f1a0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
1f1b0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
1f1c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
1f1d0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
1f1e0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
1f1f0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
1f200 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1f210 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
1f220 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
1f230 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
1f240 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
1f250 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
1f260 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
1f270 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
1f280 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
1f290 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
1f2a0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
1f2b0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1f2c0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
1f2d0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
1f2e0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
1f2f0 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
1f300 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
1f310 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
1f320 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
1f330 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1f340 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
1f350 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
1f360 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20  thname + 1);.   
1f370 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
1f380 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
1f390 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
1f3a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
1f3b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
1f3c0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f3d0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1f3e0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
1f3f0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
1f400 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20  -journal", 8);. 
1f410 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f420 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
1f430 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
1f440 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
1f450 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
1f460 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
1f470 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1f480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
1f490 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
1f4a0 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
1f4b0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
1f4c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f4d0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
1f4e0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1f4f0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
1f500 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1f510 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1f520 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
1f530 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
1f540 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
1f550 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
1f560 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1f570 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
1f580 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
1f590 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
1f5a0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
1f5b0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
1f5c0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
1f5d0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
1f5e0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
1f5f0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
1f600 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1f610 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
1f620 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
1f630 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
1f640 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
1f650 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1f660 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
1f670 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
1f680 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1f690 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1f6a0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
1f6b0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
1f6c0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
1f6d0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
1f6e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1f6f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1f700 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1f710 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1f720 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
1f730 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
1f740 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1f750 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f760 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
1f770 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
1f780 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
1f790 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
1f7a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
1f7b0 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
1f7c0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f7d0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
1f7e0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f7f0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f800 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
1f810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f820 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f830 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
1f840 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1f850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1f860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f870 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1f880 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1f890 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1f8a0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1f8b0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1f8c0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
1f8d0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
1f8e0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
1f8f0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
1f900 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
1f910 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
1f920 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
1f930 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
1f940 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f950 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f960 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
1f970 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
1f980 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
1f990 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1f9a0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
1f9b0 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
1f9c0 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
1f9d0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
1f9e0 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
1f9f0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1fa00 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
1fa10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1fa20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1fa30 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1fa40 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
1fa50 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
1fa60 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
1fa70 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
1fa80 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
1fa90 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
1faa0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
1fab0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
1fac0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
1fad0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
1fae0 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
1faf0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
1fb00 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
1fb10 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
1fb20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
1fb30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1fb40 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
1fb50 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
1fb60 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
1fb70 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
1fb80 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
1fb90 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
1fba0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
1fbb0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
1fbc0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1fbd0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
1fbe0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
1fbf0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1fc00 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1fc10 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1fc20 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
1fc30 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1fc40 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
1fc50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
1fc60 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
1fc70 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
1fc80 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
1fc90 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
1fca0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1fcb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1fcc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
1fcd0 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
1fce0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1fcf0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
1fd00 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 29 3b  r, &szPageDflt);
1fd10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1fd20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1fd30 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
1fd40 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
1fd50 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
1fd60 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
1fd70 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
1fd80 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1fd90 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
1fda0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
1fdb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fdc0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1fdd0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
1fde0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1fdf0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1fe00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1fe10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
1fe20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1fe30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1fe40 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
1fe50 2a 2f 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  */.  nExtra = RO
1fe60 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
1fe70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
1fe80 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
1fe90 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
1fec0 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
1fed0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1fee0 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
1fef0 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
1ff00 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
1ff10 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
1ff20 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
1ff30 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
1ff40 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
1ff50 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
1ff60 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
1ff70 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
1ff80 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
1ff90 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
1ffa0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e  >noReadlock = (n
1ffb0 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
1ffc0 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f  dOnly) ?1:0;.  /
1ffd0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
1ffe0 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
1fff0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20000 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
20010 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
20020 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
20030 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29  SizeValid = (u8)
20040 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67  memDb;.  /* pPag
20050 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
20060 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20070 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
20080 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20090 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
200a0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
200b0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
200c0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
200d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
200e0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
200f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20100 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
20110 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
20120 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
20130 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50  LOCK) );.  /* pP
20140 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
20150 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20160 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
20170 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
20180 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
20190 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
201a0 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
201b0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
201c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
201d0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
201e0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
201f0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
20200 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
20210 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
20220 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
20230 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
20240 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20250 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20260 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
20270 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
20280 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
20290 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
202a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
202b0 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
202c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
202d0 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
202e0 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
202f0 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  l) ?1:0;.  pPage
20300 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
20310 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
20320 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
20330 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
20340 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
20350 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
20360 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
20370 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
20380 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
20390 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
203a0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
203b0 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61  >nExtra = nExtra
203c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
203d0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
203e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
203f0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
20400 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
20410 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
20420 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
20430 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
20440 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ager);.  if( mem
20450 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
20460 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20470 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20480 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
20490 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
204a0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
204b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
204c0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
204d0 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
204e0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
204f0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
20500 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
20510 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
20520 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
20530 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
20540 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20550 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
20560 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
20570 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
20580 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
20590 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
205a0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
205b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
205c0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
205d0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
205e0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
205f0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
20600 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
20610 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
20620 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
20630 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20640 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
20650 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
20660 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20670 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
20680 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
20690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
206a0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
206b0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
206c0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
206d0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
206e0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
206f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20700 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
20710 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
20720 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
20730 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
20740 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
20750 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
20760 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
20770 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20780 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
20790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
207a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
207b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
207c0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
207d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
207e0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
207f0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
20800 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
20810 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
20820 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
20830 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
20840 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
20850 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
20860 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
20870 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
20880 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
20890 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
208a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
208b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
208c0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
208d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
208e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
208f0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
20900 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
20910 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
20920 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
20930 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
20940 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
20950 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
20960 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
20970 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
20980 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
20990 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
209a0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
209b0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
209c0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
209d0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
209e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
209f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
20a00 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
20a10 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
20a20 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
20a30 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20a40 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
20a50 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
20a60 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
20a70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
20a80 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
20a90 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20aa0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
20ab0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
20ac0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
20ad0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
20ae0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
20af0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
20b00 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
20b10 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
20b20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
20b30 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
20b40 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
20b50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20b60 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
20b70 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
20b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
20b90 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
20ba0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20bb0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
20bc0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
20bd0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
20be0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20c10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
20c20 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
20c30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20c40 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
20c50 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
20c60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20c70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
20c80 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
20c90 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
20ca0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20cb0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20cc0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
20cd0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2a 70 45  ->jfd) );..  *pE
20ce0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20  xists = 0;.  rc 
20cf0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
20d00 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
20d10 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
20d20 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
20d30 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20  &exists);.  if( 
20d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20d50 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
20d60 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20  nt locked;      
20d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20d80 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
20d90 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
20da0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
20db0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
20dc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
20dd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
20de0 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
20df0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
20e00 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
20e10 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20  int nPage;..    
20e20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73    /* Check the s
20e30 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20e40 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20  ase file. If it 
20e50 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61  consists of 0 pa
20e60 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ges,.      ** th
20e70 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
20e80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20  urnal file. See 
20e90 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
20ea0 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20  nt above for .  
20eb0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f      ** the reaso
20ec0 6e 69 6e 67 20 68 65 72 65 2e 0a 20 20 20 20 20  ning here..     
20ed0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
20ee0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
20ef0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
20f00 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
20f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
20f30 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
20f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20f50 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
20f60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20f70 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
20f80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
20f90 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
20fa0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
20fb0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
20fc0 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
20fd0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
20fe0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
20ff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21000 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
21010 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
21020 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
21030 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
21040 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
21050 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21060 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
21070 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
21080 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
21090 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
210a0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
210b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
210c0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
210d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
210e0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
210f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
21100 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
21110 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
21120 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21130 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
21140 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
21150 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
21160 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
21170 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21190 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
211a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
211b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
211c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
211d0 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
211e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
211f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21200 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
21210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21220 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21240 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21250 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
21260 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
21270 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
21280 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
21290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
212a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
212b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
212c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
212d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
212e0 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
212f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21300 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
21310 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
21320 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
21330 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
21340 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21350 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
21360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
21370 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
21380 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
21390 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
213a0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
213b0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
213c0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
213d0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
213e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
213f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
21400 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
21410 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
21420 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
21430 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
21440 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
21450 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21460 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
21470 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
21480 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21490 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
214a0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
214b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
214c0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
214d0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
214e0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
214f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
21500 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
21530 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73  e */.  i64 iOffs
21540 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
21550 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
21560 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65  et of file to re
21570 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73  ad from */..  as
21580 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21590 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
215a0 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  D && !MEMDB );..
215b0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
215c0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
215d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
215e0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
215f0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
21600 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
21610 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65  ageSize);.    re
21620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21630 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20 3d 20    }.  iOffset = 
21640 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
21650 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
21660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21670 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
21680 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
21690 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
216a0 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
216b0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
216c0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
216d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
216e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
216f0 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38 20 2a 64  ==1 ){.    u8 *d
21700 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
21710 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
21720 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  4];.    memcpy(&
21730 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
21740 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
21750 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
21760 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
21770 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
21780 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
21790 6e 6f 2c 20 33 29 3b 0a 0a 20 20 50 41 47 45 52  no, 3);..  PAGER
217a0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
217b0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
217c0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
217d0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
217e0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
217f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
21800 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
21810 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
21820 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
21830 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
21840 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
21850 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
21860 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
21870 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
21880 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
21890 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
218a0 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 74  alled whenever t
218b0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 72  he upper layer r
218c0 65 71 75 65 73 74 73 20 61 20 64 61 74 61 62 61  equests a databa
218d0 73 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 72 65  se.** page is re
218e0 71 75 65 73 74 65 64 2c 20 62 65 66 6f 72 65 20  quested, before 
218f0 74 68 65 20 63 61 63 68 65 20 69 73 20 63 68 65  the cache is che
21900 63 6b 65 64 20 66 6f 72 20 61 20 73 75 69 74 61  cked for a suita
21910 62 6c 65 20 70 61 67 65 0a 2a 2a 20 6f 72 20 61  ble page.** or a
21920 6e 79 20 64 61 74 61 20 69 73 20 72 65 61 64 20  ny data is read 
21930 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21940 65 2e 20 49 74 20 70 65 72 66 6f 72 6d 73 20 74  e. It performs t
21950 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
21960 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  two functions:.*
21970 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
21980 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
21990 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c  tly in PAGER_UNL
219a0 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  OCK state (no lo
219b0 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
219c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
219d0 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
219e0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
219f0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
21a00 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
21a10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
21a20 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
21a30 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
21a40 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
21a50 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
21a60 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
21a70 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
21a80 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
21a90 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
21aa0 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
21ab0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
21ac0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
21ad0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
21ae0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
21af0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
21b00 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
21b10 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
21b20 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
21b30 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
21b40 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
21b50 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
21b60 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
21b70 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
21b80 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
21b90 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
21ba0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
21bb0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
21bc0 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
21bd0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
21be0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
21bf0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
21c00 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
21c10 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
21c20 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
21c30 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
21c40 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
21c50 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
21c60 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
21c70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
21c80 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
21c90 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
21ca0 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
21cb0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
21cc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  *.** If the oper
21cd0 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
21ce0 62 79 20 28 32 29 20 61 62 6f 76 65 20 69 73 20  by (2) above is 
21cf0 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61  not attempted, a
21d00 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd if the.** pag
21d10 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
21d20 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
21d30 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77  an SQLITE_FULL w
21d40 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
21d50 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
21d60 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
21d70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
21d80 74 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74  t is permitted t
21d90 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61  o read the.** da
21da0 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53  tabase when in S
21db0 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72  QLITE_FULL error
21dc0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74   state..**.** Ot
21dd0 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72  herwise, if ever
21de0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
21df0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
21e00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
21e10 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f  an.** IO error o
21e20 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
21e30 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
21e40 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
21e50 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
21e60 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  file or rolling 
21e70 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
21e80 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ile, the IO erro
21e90 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
21ea0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
21eb0 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
21ec0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
21ed0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21ee0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
21ef0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21f00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
21f10 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b  sErrorReset = 0;
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f30 20 54 72 75 65 20 69 66 20 72 65 63 6f 76 65 72   True if recover
21f40 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73  ing from error s
21f50 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  tate */..  /* If
21f60 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
21f70 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63  s opened for exc
21f80 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68  lusive access, h
21f90 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
21fa0 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66  g .  ** page ref
21fb0 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69  erences and is i
21fc0 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  n an error-state
21fd0 2c 20 74 68 69 73 20 69 73 20 61 20 63 68 61 6e  , this is a chan
21fe0 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
21ff0 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
22000 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
22010 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
22020 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e  che and treat an
22030 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72  y.  ** open jour
22040 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f  nal file as a ho
22050 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t-journal..  */.
22060 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
22070 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22080 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 73 71 6c  eMode .   && sql
22090 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
220a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
220b0 68 65 29 3d 3d 30 20 26 26 20 70 50 61 67 65 72  he)==0 && pPager
220c0 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20 29 7b 0a  ->errCode .  ){.
220d0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
220e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
220f0 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65       isErrorRese
22100 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
22110 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22120 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22130 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
22140 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
22150 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22160 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72   still in an err
22170 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
22180 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72   proceed. The er
22190 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20  ror .  ** state 
221a0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
221b0 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
221c0 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e   the future when
221d0 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20   all page .  ** 
221e0 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64  references are d
221f0 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63  ropped and the c
22200 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
22210 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  arded..  */.  if
22220 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
22230 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
22240 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
22250 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
22260 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
22270 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
22280 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
22290 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72  _UNLOCK || isErr
222a0 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73  orReset ){.    s
222b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
222c0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
222d0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
222e0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  isHotJournal = 0
222f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
22300 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
22310 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
22320 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
22330 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
22340 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
22350 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
22360 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22370 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
22380 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
22390 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
223a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
223b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
223c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
223d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
223e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
223f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22400 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
22410 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
22420 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
22430 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
22440 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22450 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
22460 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22470 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
22480 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
22490 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
224a0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
224b0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
224c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
224d0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
224e0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
224f0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
22500 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
22510 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
22520 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
22530 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
22540 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
22550 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
22560 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a  &isHotJournal);.
22570 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22590 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
225a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
225b0 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
225c0 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
225d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  al ){.      /* G
225e0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
225f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
22600 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
22610 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
22620 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
22630 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
22640 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
22650 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
22660 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
22670 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
22680 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
22690 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
226a0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
226b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
226c0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
226d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
226e0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
226f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
22700 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
22710 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
22720 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
22730 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
22740 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
22750 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
22760 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
22770 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
22780 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
22790 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
227a0 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
227b0 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
227c0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
227d0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
227e0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
227f0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
22800 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
22810 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
22820 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
22830 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
22840 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
22850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
22870 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
22880 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  <EXCLUSIVE_LOCK 
22890 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
228a0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
228b0 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
228c0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
228d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
228e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
228f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
22900 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
22910 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
22920 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
22930 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22940 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
22950 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
22960 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65  }. .      /* Ope
22970 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
22980 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
22990 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ess. This is bec
229a0 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  ause in .      *
229b0 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
229c0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
229d0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
229e0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
229f0 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69  d.      ** possi
22a00 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
22a10 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
22a20 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
22a30 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
22a40 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
22a50 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
22a60 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
22a70 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
22a80 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64  .      ** a read
22a90 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64  /write file hand
22aa0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
22ab0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
22ac0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
22ad0 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
22ae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22af0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
22b00 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s,pPager->zJourn
22b10 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53  al,SQLITE_ACCESS
22b20 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20  _EXISTS,&res);. 
22b30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22b50 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
22b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22b70 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
22b80 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
22b90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
22ba0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
22bb0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
22bc0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
22bd0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
22be0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
22bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22c00 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
22c10 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
22c20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
22c30 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
22c40 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22c50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
22c60 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
22c70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
22c80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22c90 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
22ca0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
22cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
22cc0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
22cd0 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  PEN;.           
22ce0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
22cf0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
22d00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22d10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
22d30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
22d40 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 61  s not exist, tha
22d50 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68  t means some oth
22d60 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20  er process.     
22d70 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
22d80 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20  ready rolled it 
22d90 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  back */.        
22da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22db0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
22dc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22dd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
22de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22df0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
22e00 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
22e10 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20     /* TODO: Why 
22e20 61 72 65 20 74 68 65 73 65 20 63 6c 65 61 72 65  are these cleare
22e30 64 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65  d here? Is it ne
22e40 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20  cessary? */.    
22e50 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22e60 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
22e70 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22e80 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
22e90 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
22ea0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
22eb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
22ec0 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
22ed0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
22ee0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
22ef0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
22f00 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
22f10 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
22f20 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
22f30 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
22f40 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
22f50 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
22f60 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
22f70 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
22f80 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
22f90 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
22fa0 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
22fb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22fc0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22fd0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
22fe0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23000 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
23010 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
23020 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
23030 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
23040 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
23050 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
23060 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
23070 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
23080 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
23090 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
230a0 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
230b0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
230c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
230d0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
230e0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
230f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
23100 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
23110 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
23120 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
23130 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
23140 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
23150 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
23160 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
23170 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
23180 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
23190 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
231a0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
231b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
231c0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
231d0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
231e0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
231f0 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
23200 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
23210 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
23220 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
23230 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
23240 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
23250 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
23260 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
23270 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
23280 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
23290 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
232a0 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
232b0 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
232c0 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
232d0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
232e0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
232f0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
23300 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
23310 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
23320 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
23330 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
23340 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
23350 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
23360 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
23370 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
23380 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
23390 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
233a0 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
233b0 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
233c0 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
233d0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
233e0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
233f0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
23400 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
23410 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
23420 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
23430 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
23440 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23450 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
23460 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66  r, 0);..      if
23470 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
23480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
23490 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
234a0 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
234b0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
234c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
234d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
234e0 69 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  id );.      if( 
234f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
23500 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
23510 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
23520 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
23530 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
23540 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
23550 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
23560 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
23570 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
23580 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
23590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
235a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
235b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
235c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
235d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
235e0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
235f0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
23600 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
23610 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
23620 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
23630 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
23640 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
23650 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
23660 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
23670 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
23680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
236a0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
236b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
236c0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
236d0 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
236e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
236f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
23700 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
23710 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
23720 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
23730 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
23740 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
23750 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
23760 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23770 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
23780 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
23790 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
237a0 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
237b0 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
237c0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
237d0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
237e0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
237f0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
23800 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
23810 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
23820 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
23830 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
23840 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
23850 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
23860 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
23870 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
23880 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
23890 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
238a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
238b0 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
238c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
238d0 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  ( (sqlite3Pcache
238e0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
238f0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20  >pPCache)==0).  
23900 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
23910 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
23920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
23930 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
23940 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
23950 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
23960 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70   }.}../*.** Drop
23970 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
23980 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c   cache using sql
23990 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29  ite3PcacheDrop()
239a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
239b0 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
239c0 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74  now no pages wit
239d0 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  h references to 
239e0 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  them, a rollback
239f0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74  .** occurs and t
23a00 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
23a10 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76  atabase is remov
23a20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
23a30 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65  id pagerDropPage
23a40 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
23a50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
23a60 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
23a70 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
23a80 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  p(pPg);.  pagerU
23a90 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
23aa0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
23ab0 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
23ac0 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
23ad0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
23ae0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
23af0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
23b00 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
23b10 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
23b20 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
23b30 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
23b40 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
23b50 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
23b60 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23b70 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
23b80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
23b90 6c 73 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  ls pagerSharedLo
23ba0 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 61  ck() to obtain a
23bb0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a   SHARED lock on.
23bc0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
23bd0 66 69 6c 65 20 69 66 20 73 75 63 68 20 61 20 6c  file if such a l
23be0 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 69  ock or greater i
23bf0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
23c00 6c 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20  ld..** This may 
23c10 63 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  cause hot-journa
23c20 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
23c30 63 61 63 68 65 20 70 75 72 67 65 2e 20 53 65 65  cache purge. See
23c40 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f   comments.** abo
23c50 76 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ve function page
23c60 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f  rSharedLock() fo
23c70 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
23c80 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
23c90 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
23ca0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
23cb0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
23cc0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
23cd0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
23ce0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
23cf0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
23d00 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
23d10 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
23d20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
23d30 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
23d40 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
23d50 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
23d60 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
23d70 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
23d80 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
23d90 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
23da0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
23db0 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
23dc0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
23dd0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
23de0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
23df0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
23e00 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
23e10 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
23e20 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
23e30 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
23e40 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
23e50 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
23e60 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
23e70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
23e80 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
23e90 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
23ea0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
23eb0 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
23ec0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
23ed0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
23ee0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
23ef0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
23f00 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
23f10 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
23f20 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
23f30 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
23f40 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
23f50 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
23f60 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
23f70 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
23f80 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
23f90 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
23fa0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
23fb0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
23fc0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
23fd0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
23fe0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
23ff0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
24000 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
24010 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
24020 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
24030 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
24040 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
24050 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
24060 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
24070 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
24080 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
24090 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
240a0 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
240b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
240c0 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
240d0 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
240e0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
240f0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
24100 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
24110 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
24120 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
24130 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74   populate with t
24140 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
24150 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
24160 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
24170 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
24180 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
24190 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
241a0 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
241b0 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
241c0 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
241d0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
241e0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
241f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
24200 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
24210 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
24220 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
24230 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
24240 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
24250 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
24260 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
24270 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
24280 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
24290 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
242a0 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
242b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
242c0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
242d0 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
242e0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
242f0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
24300 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24310 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
24320 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
24330 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
24340 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
24350 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
24360 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
24370 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
24380 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
24390 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
243a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
243b0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
243c0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
243d0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
243e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
243f0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
24400 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
24410 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
24420 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
24430 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
24440 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
24450 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
24460 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
24470 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
24480 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
24490 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
244a0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
244b0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
244c0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
244d0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
244e0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
244f0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
24500 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
24510 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
24520 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
24530 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
24540 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
24550 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
24560 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
24570 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
24580 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
24590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
245a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
245b0 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
245c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
245d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
245e0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
245f0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
24600 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
24610 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
24620 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
24630 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
24640 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
24650 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
24660 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
24670 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
24680 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
24690 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
246a0 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
246b0 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
246c0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74   *pPg = 0;.  int
246d0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
246e0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
246f0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
24700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24710 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
24720 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73  OCK .       || s
24730 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
24740 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
24750 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20  ache)>0 .       
24760 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a  || pgno==1.  );.
24770 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
24780 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
24790 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
247a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
247b0 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
247c0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
247d0 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
247e0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
247f0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
24800 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
24810 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
24820 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
24830 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
24840 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24850 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
24860 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
24870 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
24880 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
24890 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
248a0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
248b0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20   *ppPage = 0;.. 
248c0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
248d0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
248e0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
248f0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
24900 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
24910 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
24920 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
24930 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
24940 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
24950 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
24960 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
24970 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
24980 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
24990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
249a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
249b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
249c0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
249d0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d  NLOCK );..  rc =
249e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
249f0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
24a00 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70  che, pgno, 1, &p
24a10 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
24a20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24a40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
24a50 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
24a60 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
24a70 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
24a80 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20  ->pPager==0 );. 
24a90 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72   if( pPg->pPager
24aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
24ab0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
24ac0 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
24ad0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
24ae0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
24af0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
24b00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
24b10 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45  t nMax;.    PAGE
24b20 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
24b30 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e  Miss);.    pPg->
24b40 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
24b50 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
24b60 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24b70 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
24b80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24ba0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
24bb0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
24bc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
24bd0 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
24be0 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
24bf0 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
24c00 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
24c10 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
24c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24c30 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
24c40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24c50 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
24c60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
24c70 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
24c80 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
24c90 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
24ca0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
24cb0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
24cc0 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
24cd0 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
24ce0 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
24cf0 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
24d00 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
24d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
24d20 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
24d30 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
24d40 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
24d50 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
24d60 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
24d70 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
24d80 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
24d90 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
24da0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
24db0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
24dc0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
24dd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
24de0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
24df0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
24e00 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
24e10 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
24e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
24e30 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
24e40 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
24e50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
24e60 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
24e70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
24e80 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
24e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24ea0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
24eb0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
24ec0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
24ed0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
24ee0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
24ef0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
24f00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24f10 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
24f20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24f30 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50         memset(pP
24f40 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
24f50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
24f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
24f70 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
24f80 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
24f90 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
24fa0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24fb0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
24fc0 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ger );.      rc 
24fd0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
24fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
24ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25000 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50        pagerDropP
25010 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
25020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25030 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
25040 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
25050 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
25060 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
25070 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
25080 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
25090 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
250a0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
250b0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
250c0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
250d0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
250e0 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   }..  *ppPage = 
250f0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
25100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25110 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
25120 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
25130 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
25140 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
25150 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
25160 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
25170 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
25180 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
25190 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
251a0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
251b0 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30  . Also, return 0
251c0 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   if the .** page
251d0 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e  r is in PAGER_UN
251e0 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20  LOCK state when 
251f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25200 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69   called,.** or i
25210 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
25220 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
25230 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
25240 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  TE_FULL..**.** S
25250 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
25260 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
25270 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
25280 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
25290 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
252a0 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
252b0 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
252c0 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
252d0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
252e0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
252f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
25300 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
25310 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
25320 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
25330 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
25340 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
25350 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
25360 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
25370 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
25380 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
25390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
253a0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
253b0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73  r *pPg = 0;.  as
253c0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
253d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
253e0 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  o!=0 );..  if( (
253f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
25400 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20  AGER_UNLOCK).   
25410 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43  && (pPager->errC
25420 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
25430 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
25440 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a  e==SQLITE_FULL).
25450 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
25460 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
25470 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
25480 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d  o, 0, &pPg);.  }
25490 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ..  return pPg;.
254a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
254b0 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
254c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
254d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
254e0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
254f0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
25500 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
25510 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
25520 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
25530 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
25540 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
25550 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
25560 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
25570 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
25580 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
25590 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
255a0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
255b0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
255c0 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
255d0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
255e0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
255f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
25600 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
25610 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49      pagerUnlockI
25620 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
25630 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
25640 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
25650 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61  l file has alrea
25660 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
25670 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  ensure that the.
25680 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
25690 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e  ile is open too.
256a0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
256b0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e  rnal is not open
256c0 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
256d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
256e0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
256f0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
25700 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
25710 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
25720 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49   .** An SQLITE_I
25730 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
25740 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25750 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a  if a call to .**
25760 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
25770 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
25780 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
25790 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
257a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
257b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
257c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
257d0 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
257e0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
257f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
25800 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
25810 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25820 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
25830 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
25840 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
25850 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
25860 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
25870 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
25880 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
25890 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
258a0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
258b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
258c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
258d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
258e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
258f0 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
25900 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
25910 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
25920 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
25930 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
25940 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
25950 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
25960 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
25970 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
25980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25990 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
259a0 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
259b0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
259c0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
259d0 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
259e0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
259f0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
25a00 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
25a10 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
25a20 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
25a30 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
25a40 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
25a50 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
25a60 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
25a70 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
25a80 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
25a90 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
25aa0 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
25ab0 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
25ac0 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
25ad0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
25ae0 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
25af0 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
25b00 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
25b10 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
25b20 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
25b30 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
25b40 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
25b50 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
25b60 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
25b70 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
25b80 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
25b90 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
25ba0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
25bb0 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
25bc0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
25bd0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
25be0 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
25bf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
25c00 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
25c10 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
25c20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
25c30 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
25c40 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
25c50 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
25c60 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
25c70 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
25c80 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
25c90 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
25ca0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
25cb0 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
25cc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
25cd0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
25ce0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
25cf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25d00 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
25d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25d20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
25d30 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
25d40 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
25d50 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
25d60 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
25d70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
25d80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
25d90 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
25da0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
25db0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
25dc0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
25dd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
25de0 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
25df0 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
25e00 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
25e10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25e20 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
25e30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
25e40 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
25e50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25e60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f  ;.  }..  /* TODO
25e70 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70  : Is it really p
25e80 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68  ossible to get h
25e90 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56  ere with dbSizeV
25ea0 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c  alid==0? If not,
25eb0 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74  .  ** the call t
25ec0 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o PagerPagecount
25ed0 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  () can be remove
25ee0 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  d..  */.  testca
25ef0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
25f00 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
25f10 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
25f20 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
25f30 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  ;..  pPager->pIn
25f40 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
25f50 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
25f60 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
25f70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
25f80 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
25f90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25fa0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
25fb0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
25fc0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
25fd0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
25fe0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
25ff0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26000 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
26010 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
26020 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26030 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
26040 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
26050 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
26060 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
26070 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
26080 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
26090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
260a0 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
260b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
260c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
260d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
260e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
260f0 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
26100 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
26110 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26120 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
26130 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
26140 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
26150 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26160 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
26170 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
26180 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26190 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
261a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
261b0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
261c0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
261d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
261e0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
261f0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
26200 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
26210 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
26220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26230 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
26240 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
26250 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
26260 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
26270 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
26280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
26290 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
262a0 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
262b0 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
262c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
262d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
262e0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
262f0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
26300 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
26310 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
26320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26330 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
26340 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
26350 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
26360 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
26370 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
26380 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
26390 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
263a0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
263b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
263c0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
263d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
263e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
263f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
26400 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
26410 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
26420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
26430 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
26440 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
26450 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
26460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26470 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
26480 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
26490 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
264a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
264b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
264c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
264d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
264e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
264f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
26500 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
26510 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26520 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
26530 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
26540 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
26550 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
26560 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
26570 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
26580 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
26590 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
265a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
265b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
265c0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
265d0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
265e0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
265f0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
26600 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26610 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
26620 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
26630 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
26640 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26650 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
26660 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
26670 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
26680 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
26690 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
266a0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
266b0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
266c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
266d0 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
266e0 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
266f0 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
26700 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
26710 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
26720 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
26730 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
26740 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
26750 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
26760 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
26770 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
26780 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
26790 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
267a0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
267b0 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
267c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
267d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
267e0 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
267f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
26800 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
26810 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
26820 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
26830 6f 66 20 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  of it..*/.int sq
26840 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
26850 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
26860 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 69 6e  nt exFlag){.  in
26870 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26890 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
268a0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
268b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
268c0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
268d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
268e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
268f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26900 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
26910 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
26920 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  .    /* Obtain a
26930 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
26940 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26950 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
26960 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
26970 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
26980 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
26990 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
269a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
269b0 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79   The.    ** busy
269c0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
269d0 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
269e0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
269f0 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
26a00 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
26a10 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
26a20 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
26a30 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
26a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
26a50 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
26a60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
26a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
26a90 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
26aa0 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
26ab0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
26ac0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
26ad0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
26ae0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
26af0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
26b00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
26b10 20 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64   If the required
26b20 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63   locks were succ
26b30 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
26b40 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  d, open the jour
26b50 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
26b60 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69  and write the fi
26b70 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
26b80 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  er to it..    */
26b90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26ba0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
26bb0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
26bc0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
26bd0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
26be0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
26bf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
26c00 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
26c10 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
26c20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
26c30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26c40 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
26c50 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
26c60 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
26c70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
26c80 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
26c90 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
26ca0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
26cb0 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
26cc0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
26cd0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
26ce0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
26cf0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
26d00 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
26d10 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
26d20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
26d30 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
26d40 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
26d50 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
26d60 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
26d70 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
26d80 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
26d90 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
26da0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26db0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
26dc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26dd0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
26de0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
26df0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
26e00 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
26e10 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
26e20 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
26e30 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
26e40 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
26e50 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
26e60 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
26e70 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
26e80 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
26e90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26ea0 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
26eb0 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
26ec0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
26ed0 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
26ee0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
26ef0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
26f00 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
26f10 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
26f20 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
26f30 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
26f40 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
26f50 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
26f60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
26f70 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
26f80 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
26f90 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
26fa0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
26fb0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
26fc0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
26fd0 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
26fe0 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
26ff0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
27000 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
27010 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
27020 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
27030 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
27040 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
27050 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
27060 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
27070 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
27080 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
27090 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
270a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
270b0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
270c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
270d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
270e0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
270f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27100 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
27110 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
27120 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
27130 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
27140 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
27150 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
27160 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
27170 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
27180 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
27190 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
271a0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
271b0 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
271c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
271d0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
271e0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
271f0 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
27200 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
27210 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
27220 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
27230 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
27240 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
27250 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
27260 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
27270 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
27280 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
27290 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
272a0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
272b0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
272c0 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
272d0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
272e0 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
272f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
27300 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
27310 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
27320 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
27330 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
27340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
27350 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
27360 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
27370 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
27380 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
273a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
273b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
273c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
273d0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
273e0 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
273f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27400 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
27410 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
27420 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
27430 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
27440 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
27450 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OFF ){.      rc 
27460 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
27470 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
27480 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27490 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
274a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
274b0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
274c0 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
274d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
274e0 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
274f0 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
27500 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
27510 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
27520 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
27530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27540 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
27550 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
27560 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
27570 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
27580 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
27590 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
275a0 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72   if( !pageInJour
275b0 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70  nal(pPg) && isOp
275c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
275d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  ){.      if( pPg
275e0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
275f0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
27600 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
27610 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
27620 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20  Data2;..        
27630 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
27640 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
27650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
27660 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
27670 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
27680 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
27690 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
276a0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
276b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
276c0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
276d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
276e0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
276f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
27700 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74   );.        pDat
27710 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
27720 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
27730 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
27740 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
27750 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
27760 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
27770 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
27780 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
27790 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
277a0 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  lOff, pPg->pgno)
277b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
277c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
277d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
277e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
277f0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
27800 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27810 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
27840 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
27850 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
27860 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
27870 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
27880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
278a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
278b0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
278c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
278d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
278e0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
278f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
27900 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
27910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
27920 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
27930 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
27940 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
27950 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
27960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
27970 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
27980 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
27990 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
279a0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
279b0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
279c0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
279d0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
279e0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
279f0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
27a10 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
27a20 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
27a30 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
27a40 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
27a50 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
27a60 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
27a70 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
27a80 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
27a90 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
27aa0 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75  curred while jou
27ab0 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
27ac0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
27ad0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
27ae0 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
27af0 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
27b00 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
27b10 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
27b20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27b30 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
27b40 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
27b50 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
27b60 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
27b70 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
27b80 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
27b90 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
27ba0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
27bb0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
27bc0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
27bd0 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
27be0 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
27bf0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
27c00 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
27c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27c20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27c30 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
27c40 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
27c50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
27c60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
27c70 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
27c80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
27c90 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
27ca0 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74  as occurred writ
27cb0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
27cc0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
27cd0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
27ce0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
27cf0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
27d00 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
27d10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27d20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27d30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
27d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27d50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61    }..        pPa
27d60 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
27d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
27d80 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
27d90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
27da0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
27db0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
27dc0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
27dd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
27de0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
27df0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
27e00 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27e10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
27e20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
27e30 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
27e40 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
27e50 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
27e60 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
27e70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
27e90 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
27ea0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
27eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
27ee0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
27ef0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
27f00 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
27f10 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
27f20 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
27f30 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
27f40 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
27f50 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
27f60 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
27f70 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
27f80 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
27f90 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
27fa0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
27fb0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
27fc0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
27fd0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
27fe0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
27ff0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
28000 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
28010 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
28020 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
28030 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
28040 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
28050 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
28060 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
28070 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
28080 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
28090 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
280a0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
280b0 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
280c0 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
280d0 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
280e0 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
280f0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
28100 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
28110 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
28120 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
28130 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
28140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
28150 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
28160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28170 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
28180 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
28190 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
281a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
281b0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
281c0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
281d0 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
281e0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
281f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
28200 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
28210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28220 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
28230 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
28240 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
28250 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
28260 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68  re .** making ch
28270 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
28280 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
28290 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
282a0 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74  n value .** of t
282b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
282c0 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
282d0 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  to change any pa
282e0 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a  ge data unless .
282f0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
28300 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
28310 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  K..**.** The dif
28320 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
28330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
28340 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
28350 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
28360 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
28370 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
28380 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
28390 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
283a0 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
283b0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
283c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
283d0 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
283e0 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
283f0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28410 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
28420 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
28430 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
28440 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
28450 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
28460 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20   returned.** as 
28470 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68  appropriate. Oth
28480 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
28490 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
284a0 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
284b0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
284c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
284d0 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
284e0 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
284f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
28500 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
28510 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
28520 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
28530 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
28540 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66  pageSize);..  if
28550 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
28560 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
28570 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
28580 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
28590 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
285a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
285b0 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
285d0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
285e0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
285f0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
28600 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28620 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
28630 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
28640 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
28650 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28670 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
28680 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
28690 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
286a0 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
286b0 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
286c0 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
286d0 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
286e0 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
286f0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
28700 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
28710 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
28720 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
28730 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
28740 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
28750 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
28760 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
28770 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
28780 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28790 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
287a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
287b0 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
287c0 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
287d0 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
287e0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
287f0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
28800 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
28810 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
28820 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
28830 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
28840 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
28850 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
28860 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
28870 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
28880 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
28890 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
288a0 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
288b0 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
288c0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ..    sqlite3Pag
288d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
288e0 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
288f0 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
28900 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
28910 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
28920 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
28930 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
28940 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
28950 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
28960 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
28970 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
28980 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
28990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
289a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
289b0 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
289c0 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
289d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
289e0 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
289f0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
28a00 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
28a10 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
28a20 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
28a30 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
28a40 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
28a50 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
28a60 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
28a70 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
28a80 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
28a90 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
28aa0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
28ab0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
28ac0 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
28ad0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
28ae0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28af0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
28b00 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
28b10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
28b20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28b40 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
28b50 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
28b60 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
28b70 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
28b80 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
28b90 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
28ba0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
28bb0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
28bc0 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
28bd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
28bf0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
28c00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
28c20 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
28c30 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
28c40 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
28c50 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
28c60 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
28c70 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
28c80 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
28c90 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
28ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
28cb0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
28cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
28cd0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
28ce0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
28cf0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
28d00 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
28d10 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
28d20 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
28d30 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
28d40 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
28d50 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
28d60 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
28d70 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
28d80 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
28d90 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
28da0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
28db0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
28dc0 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
28dd0 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
28de0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
28df0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
28e00 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
28e10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28e20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
28e30 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
28e40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28e50 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
28e60 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  ->noSync==0 );. 
28e70 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
28e80 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53  i<nPage && needS
28e90 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ync; ii++){.    
28ea0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
28eb0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
28ec0 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
28ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28ee0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
28ef0 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
28f00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
28f10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28f20 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
28f30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
28f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
28f50 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
28f60 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
28f70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28f80 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
28f90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
28fa0 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
28fb0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
28fc0 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
28fd0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
28fe0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
28ff0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
29000 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
29010 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
29020 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
29030 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
29040 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
29050 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
29060 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
29070 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
29080 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
29090 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
290a0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
290b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
290c0 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
290d0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
290e0 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
290f0 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
29100 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
29110 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
29120 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
29130 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
29140 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
29150 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
29160 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
29170 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
29180 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
29190 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
291a0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
291b0 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
291c0 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
291d0 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
291e0 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
291f0 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
29200 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
29210 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
29220 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
29230 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
29240 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
29250 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
29260 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
29270 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
29280 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
29290 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
292a0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
292b0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
292c0 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
292d0 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
292e0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
292f0 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
29300 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
29310 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
29320 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
29330 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
29340 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
29350 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
29360 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
29370 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
29380 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
29390 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
293a0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
293b0 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
293c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
293d0 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
293e0 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
293f0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
29400 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
29410 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29420 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
29430 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
29440 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
29450 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
29460 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
29470 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  RITE;.#ifdef SQL
29480 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
29490 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
294a0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
294b0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
294c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
294d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
294e0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
294f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
29500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29510 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
29520 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
29530 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
29540 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
29550 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
29560 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
29570 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  pager file..**.*
29580 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63  * If the isDirec
29590 74 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  t flag is zero, 
295a0 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
295b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
295c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
295d0 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
295e0 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
295f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
29600 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  he.** page data.
29610 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
29620 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  e file will be u
29630 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  pdated when the 
29640 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
29650 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
29660 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ted..**.** The i
29670 73 44 69 72 65 63 74 20 66 6c 61 67 20 6d 61 79  sDirect flag may
29680 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
29690 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
296a0 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
296b0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
296c0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
296d0 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
296e0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
296f0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
29700 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
29710 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
29720 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
29730 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
29740 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
29750 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
29760 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
29770 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
29780 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
29790 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
297a0 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
297b0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
297c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
297d0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
297e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
297f0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c  E_OK;..  /* Decl
29800 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  are and initiali
29810 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65  ze constant inte
29820 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20  ger 'isDirect'. 
29830 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d  If the.  ** atom
29840 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
29850 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
29860 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
29870 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20  then isDirect.  
29880 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ** is initialize
29890 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  d to the value p
298a0 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44  assed as the isD
298b0 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65  irectMode parame
298c0 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ter.  ** to this
298d0 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
298e0 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61  wise, it is alwa
298f0 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
29900 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64    **.  ** The id
29910 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68  ea is that if th
29920 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
29930 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
29940 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20  ot.  ** enabled 
29950 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
29960 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61   the compiler ca
29970 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73  n omit the tests
29980 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65   of.  ** 'isDire
29990 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65  ct' below, as we
299a0 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20  ll as the block 
299b0 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a  enclosed in the.
299c0 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65    ** "if( isDire
299d0 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e  ct )" condition.
299e0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
299f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
29a00 49 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e 73 74  IC_WRITE.  const
29a10 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20   int isDirect = 
29a20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  0;.  assert( isD
29a30 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a  irectMode==0 );.
29a40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29a50 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29  ER(isDirectMode)
29a60 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
29a70 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20 69  int isDirect = i
29a80 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23 65 6e  sDirectMode;.#en
29a90 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
29aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
29ab0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
29ac0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
29ad0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
29ae0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
29af0 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
29b00 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20  *pPgHdr;        
29b10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
29b20 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
29b30 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65  /.    u32 change
29b40 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  _counter;       
29b50 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
29b60 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63  alue of change-c
29b70 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a  ounter field */.
29b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
29b90 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
29ba0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
29bb0 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  >fd) );..    /* 
29bc0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
29bd0 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
29be0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
29bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
29c00 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
29c10 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Hdr);.    assert
29c20 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72  ( pPgHdr==0 || r
29c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
29c40 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20  .    /* If page 
29c50 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20  one was fetched 
29c60 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e  successfully, an
29c70 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
29c80 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70  is not.    ** op
29c90 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63  erating in direc
29ca0 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67  t-mode, make pag
29cb0 65 20 31 20 77 72 69 74 61 62 6c 65 2e 0a 20 20  e 1 writable..  
29cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
29cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
29ce0 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
29cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29d00 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
29d10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
29d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29d30 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  .      /* Increm
29d40 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
29d50 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
29d60 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
29d70 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63  e 24. */.      c
29d80 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
29d90 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
29da0 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
29db0 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20  ileVers);.      
29dc0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
29dd0 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
29de0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
29df0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
29e00 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
29e10 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69       /* If runni
29e20 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64  ng in direct mod
29e30 65 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e  e, write the con
29e40 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20  tents of page 1 
29e50 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a  to the file. */.
29e60 20 20 20 20 20 20 69 66 28 20 69 73 44 69 72 65        if( isDire
29e70 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ct ){.        co
29e80 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
29e90 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
29ea0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29eb0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29ec0 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
29ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29ee0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
29ef0 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
29f00 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
29f10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
29f20 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
29f30 65 64 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e  ed, set the chan
29f40 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
29f50 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  . */.      if( r
29f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29f70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
29f80 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
29f90 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
29fa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
29fb0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
29fc0 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
29fd0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29fe0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
29ff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a000 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
2a010 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  r file to disk. 
2a020 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
2a030 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  for in-memory fi
2a040 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  les.** or pages 
2a050 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
2a060 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
2a070 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2a080 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f  ful, or called o
2a090 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
2a0a0 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
2a0b0 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
2a0c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2a0d0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
2a0e0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2a0f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
2a100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a110 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
2a120 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2a130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a150 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2a160 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20  .  if( MEMDB || 
2a170 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2a180 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2a190 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2a1a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a1b0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
2a1c0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
2a1d0 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lags);.  }.  ret
2a1e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a1f0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
2a200 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
2a210 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
2a220 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
2a230 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
2a240 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2a250 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
2a260 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2a270 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
2a280 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
2a290 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
2a2a0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
2a2b0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
2a2c0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
2a2d0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
2a2e0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
2a2f0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
2a300 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
2a310 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  hat:.**.**   * T
2a320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a330 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2a340 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20  is updated,.**  
2a350 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69   * the journal i
2a360 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73  s synced (unless
2a370 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2a380 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2a390 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20  s used),.**   * 
2a3a0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
2a3b0 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  are written to t
2a3c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a3d0 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  , .**   * the da
2a3e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
2a3f0 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71  runcated (if req
2a400 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20  uired), and.**  
2a410 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
2a420 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a  file synced. .**
2a430 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
2a440 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20  ng that remains 
2a450 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
2a460 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
2a470 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65  finalize .** (de
2a480 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f  lete, truncate o
2a490 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  r zero the first
2a4a0 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f   part of) the jo
2a4b0 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a  urnal file (or .
2a4c0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ** delete the ma
2a4d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2a4e0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
2a4f0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2a500 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
2a510 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
2a520 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
2a530 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
2a540 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
2a550 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2a560 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
2a570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
2a580 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
2a590 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
2a5a0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
2a5b0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
2a5c0 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
2a5d0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
2a5e0 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
2a5f0 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
2a600 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
2a610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
2a620 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
2a630 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
2a640 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
2a650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
2a660 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
2a670 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
2a680 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
2a690 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a6b0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
2a6c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2a6d0 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20  zMaster,        
2a6e0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
2a6f0 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  LL, the master j
2a700 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
2a710 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20   int noSync     
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a730 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
2a740 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68   the xSync on th
2a750 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  e db file */.){.
2a760 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a770 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2a780 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a790 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
2a7a0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
2a7b0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2a7c0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
2a7d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41   PAGERTRACE(("DA
2a7e0 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
2a7f0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
2a800 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20  nSize=%d\n", .  
2a810 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
2a820 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
2a830 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29  pPager->dbSize))
2a840 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
2a850 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2a860 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
2a870 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2a880 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
2a890 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
2a8a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2a8b0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2a8c0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  op..  */.  if( M
2a8d0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2a8e0 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
2a8f0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
2a900 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
2a910 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
2a920 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2a930 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
2a940 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   && pPager->dbMo
2a950 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f  dified ){..    /
2a960 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2a970 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
2a980 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2a990 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
2a9a0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69  .    ** does thi
2a9b0 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
2a9c0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2a9d0 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
2a9e0 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2a9f0 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  * was enabled at
2aa00 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61   compile time, a
2aa10 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73  nd if this trans
2aa20 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65  action meets the
2aa30 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65   .    ** runtime
2aa40 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
2aa50 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
2aa60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2aa70 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
2aa80 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
2aa90 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
2aaa0 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
2aab0 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
2aac0 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
2aad0 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20 20   and .    **    
2aae0 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
2aaf0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
2ab00 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
2ab10 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a  ction, and.    *
2ab20 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
2ab30 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
2ab40 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
2ab50 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
2ab60 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
2ab70 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70      ** If the op
2ab80 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e  timization was n
2ab90 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ot enabled at co
2aba0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e  mpile time, then
2abb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2abc0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2abd0 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
2abe0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
2abf0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
2ac00 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
2ac10 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
2ac20 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
2ac30 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
2ac40 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20  d in but.    ** 
2ac50 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c  is not applicabl
2ac60 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  e to this transa
2ac70 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69  ction, call sqli
2ac80 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2ac90 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  ().    ** to mak
2aca0 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
2acb0 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
2acc0 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
2acd0 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
2ace0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2acf0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
2ad00 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2ad10 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
2ad20 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d  ndirect.    ** m
2ad30 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ode. .    **.   
2ad40 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2ad50 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2ad60 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c  on is both enabl
2ad70 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c  ed and applicabl
2ad80 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  e,.    ** then c
2ad90 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
2ada0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
2adb0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2adc0 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
2add0 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
2ade0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
2adf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2ae00 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
2ae10 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2ae20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
2ae30 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  tion..    */.#if
2ae40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2ae50 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2ae60 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
2ae70 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2ae80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2ae90 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
2aea0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2aeb0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
2aec0 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
2aed0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2aee0 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26  r->jfd) .     &&
2aef0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2af00 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
2af10 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
2af20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53    && pPager->dbS
2af30 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize>=pPager->dbF
2af40 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26 20  ileSize.     && 
2af50 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74  (0==(pPg = sqlit
2af60 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2af70 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2af80 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70  e)) || 0==pPg->p
2af90 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20  Dirty).    ){.  
2afa0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2afb0 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
2afc0 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65   counter via the
2afd0 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65   direct-write me
2afe0 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20  thod. The .     
2aff0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
2b000 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
2b010 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
2b020 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
2b030 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20  age 1 .      ** 
2b040 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
2b050 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
2b060 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
2b070 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
2b080 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
2b090 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b0a0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
2b0b0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2b0c0 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65   .      ** prope
2b0d0 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
2b0e0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
2b0f0 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
2b100 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2b110 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2b120 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2b130 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
2b140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b150 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
2b160 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2b170 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b190 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2b1a0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2b1b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
2b1c0 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  }.    }.#else.  
2b1d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2b1e0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2b1f0 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64  pPager, 0);.#end
2b200 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  if.    if( rc!=S
2b210 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2b220 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2b230 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  _exit;..    /* I
2b240 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
2b250 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
2b260 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
2b270 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
2b280 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69  .    ** being di
2b290 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
2b2a0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
2b2b0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
2b2c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2b2d0 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
2b2e0 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
2b2f0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
2b300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65      **.    ** Be
2b310 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65  fore reading the
2b320 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
2b330 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20   numbers larger 
2b340 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  than the .    **
2b350 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
2b360 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
2b370 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20  set dbSize back 
2b380 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  to the value.   
2b390 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b   ** that it took
2b3a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2b3b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b3c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
2b3d0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
2b3e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2b3f0 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64  () return zeroed
2b400 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f   pages instead o
2b410 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  f .    ** readin
2b420 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
2b430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2b440 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
2b450 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2b460 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
2b470 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67  ger->dbSize<pPag
2b480 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20  er->dbOrigSize. 
2b490 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2b4a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2b4b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2b4c0 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  F .    ){.      
2b4d0 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20  Pgno i;         
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2b500 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2b510 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2b520 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  no iSkip = PAGER
2b530 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2b540 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63  ; /* Pending loc
2b550 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  k page */.      
2b560 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a  const Pgno dbSiz
2b570 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2b580 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ze;       /* Dat
2b590 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65  abase image size
2b5a0 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67 65   */ .      pPage
2b5b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
2b5c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
2b5d0 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
2b5e0 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
2b5f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
2b600 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  + ){.        if(
2b610 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2b620 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2b630 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
2b640 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
2b650 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
2b660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b670 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
2b680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
2b690 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2b6a0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
2b6b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b6c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b6d0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2b6e0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2b6f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b700 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b710 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2b720 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2b730 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2b740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b750 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2b760 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2b770 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
2b780 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20  }.      } .     
2b790 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2b7a0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  = dbSize;.    }.
2b7b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
2b7c0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
2b7d0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
2b7e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2b7f0 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20  le. If a master 
2b800 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2b810 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
2b820 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
2b830 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2b840 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20  l file, .    ** 
2b850 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
2b860 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
2b870 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
2b880 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
2b890 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
2b8a0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
2b8b0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
2b8c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69   zMaster);.    i
2b8d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b8e0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2b8f0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2b900 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2b910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2b920 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2b930 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2b940 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  is being.    ** 
2b950 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20  used, this call 
2b960 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20  will not create 
2b970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b980 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a   or perform any.
2b990 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a      ** real IO..
2b9a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2b9b0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2b9c0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
2b9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2b9e0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2b9f0 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2ba00 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
2ba10 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
2ba20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2ba30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2ba40 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71  rite_pagelist(sq
2ba50 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2ba60 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2ba70 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28 20  ache));.    if( 
2ba80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ba90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2baa0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
2bab0 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20  BLOCKED );.     
2bac0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2bad0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2bae0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
2baf0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
2bb00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
2bb10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2bb20 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f  le on disk is no
2bb30 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  t the same size 
2bb40 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2bb50 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68  image,.    ** th
2bb60 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75  en use pager_tru
2bb70 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72  ncate to grow or
2bb80 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65   shrink the file
2bb90 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
2bba0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2bbb0 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62  Size!=pPager->db
2bbc0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
2bbd0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
2bbe0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
2bbf0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
2bc00 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2bc10 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61 73  ager));.      as
2bc20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2bc30 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2bc40 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63  SIVE );.      rc
2bc50 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
2bc60 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
2bc70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2bc80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2bc90 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2bca0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  _exit;.    }..  
2bcb0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
2bcc0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2bcd0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2bce0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2bcf0 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20   && !noSync ){. 
2bd00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bd10 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2bd20 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2bd30 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20  _flags);.    }. 
2bd40 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
2bd50 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2bd60 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
2bd70 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
2bd80 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d  YNCED;.  }..comm
2bd90 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2bda0 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
2bdb0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2bdc0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  D ){.    /* page
2bdd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2bde0 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d  nter() may attem
2bdf0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  pt to obtain an 
2be00 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 2a 2a  exclusive.    **
2be10 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74   lock to spill t
2be20 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74  he cache and ret
2be30 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  urn IOERR_BLOCKE
2be40 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20  D. But since .  
2be50 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f    ** there is no
2be60 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68   chance the cach
2be70 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e is inconsisten
2be80 74 2c 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  t, it is.    ** 
2be90 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
2bea0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
2beb0 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53    **/.    rc = S
2bec0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
2bed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2bee0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
2bef0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2bf00 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61 73  led, the databas
2bf10 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
2bf20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70  completely.** up
2bf30 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74  dated to reflect
2bf40 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
2bf50 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  e by the current
2bf60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
2bf70 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69  .** synced to di
2bf80 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  sk. The journal 
2bf90 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
2bfa0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  s in the file-sy
2bfb0 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c  stem .** though,
2bfc0 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75 72   and if a failur
2bfd0 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  e occurs at this
2bfe0 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20 65   point it will e
2bff0 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20  ventually.** be 
2c000 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  used as a hot-jo
2c010 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63 75  urnal and the cu
2c020 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2c030 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
2c040 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c050 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  on finalizes the
2c060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65   journal file, e
2c070 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69 6e  ither by deletin
2c080 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e  g, .** truncatin
2c090 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 7a  g or partially z
2c0a0 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74 68  eroing it, so th
2c0b0 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  at it cannot be 
2c0c0 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74  used .** for hot
2c0d0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
2c0e0 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  k. Once this is 
2c0f0 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61 63  done the transac
2c100 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76  tion is.** irrev
2c110 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64  ocably committed
2c120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2c130 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  ror occurs, an I
2c140 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2c150 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2c160 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20   pager.** moves 
2c170 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  into the error s
2c180 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
2c190 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c1a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2c1b0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2c1c0 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
2c1d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2c1e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c200 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2c210 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  */..  /* Do not 
2c220 70 72 6f 63 65 65 64 20 69 66 20 74 68 65 20 70  proceed if the p
2c230 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
2c240 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2c250 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  te. */.  if( pPa
2c260 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
2c270 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
2c280 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
2c290 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2c2a0 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ion should not b
2c2b0 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  e called if the 
2c2c0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
2c2d0 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41  at least.  ** PA
2c2e0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
2c2f0 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64 20 53  te. And indeed S
2c300 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f 65 73  QLite never does
2c310 20 74 68 69 73 2e 20 42 75 74 20 69 74 20 69 73   this. But it is
2c320 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61  .  ** nice to ha
2c330 76 65 20 74 68 69 73 20 64 65 66 65 6e 73 69 76  ve this defensiv
2c340 65 20 62 6c 6f 63 6b 20 68 65 72 65 20 61 6e 79  e block here any
2c350 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  way..  */.  if( 
2c360 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73 74  NEVER(pPager->st
2c370 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
2c380 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ED) ){.    retur
2c390 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2c3a0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74    }..  /* An opt
2c3b0 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
2c3c0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
2c3d0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
2c3e0 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
2c3f0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2c400 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
2c410 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2c420 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
2c430 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
2c440 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
2c450 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2c460 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2c470 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
2c480 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2c490 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
2c4a0 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
2c4b0 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
2c4c0 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
2c4d0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
2c4e0 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
2c4f0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
2c500 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
2c510 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
2c520 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2c530 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
2c540 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
2c550 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c560 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
2c570 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
2c580 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
2c590 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
2c5a0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
2c5b0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2c5c0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
2c5d0 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
2c5e0 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
2c5f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
2c600 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
2c610 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  =0 && pPager->ex
2c620 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
2c630 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2c640 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2c650 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2c660 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  T.  ){.    asser
2c670 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2c680 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
2c690 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
2c6a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c6b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41  TE_OK;.  }..  PA
2c6c0 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49  GERTRACE(("COMMI
2c6d0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
2c6e0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
2c6f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2c700 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
2c710 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
2c720 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2c730 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  d );.  rc = page
2c740 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2c750 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2c760 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2c770 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2c780 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2c790 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
2c7a0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54  k all changes. T
2c7b0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
2c7c0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
2c7d0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a  SHARED mode..**.
2c7e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c7f0 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61   performs two ta
2c800 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  sks:.**.**   1) 
2c810 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  It rolls back th
2c820 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2c830 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61  restoring all da
2c840 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2c850 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f  .**      in-memo
2c860 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74  ry cache pages t
2c870 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79  o the state they
2c880 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68   were in when th
2c890 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2c8a0 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64        was opened
2c8b0 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74  , and.**   2) It
2c8c0 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
2c8d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20  ournal file, so 
2c8e0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75  that it is not u
2c8f0 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20  sed for hot.**  
2c900 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20      rollback at 
2c910 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  any point in the
2c920 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73   future..**.** s
2c930 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
2c940 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63  llowing qualific
2c950 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  ations:.**.** * 
2c960 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2c970 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  ile is not yet o
2c980 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
2c990 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2c9a0 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79  ,.**   then only
2c9b0 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (2) is performe
2c9c0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2c9d0 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72  there is no jour
2c9e0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f  nal file.**   to
2c9f0 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a   roll back..**.*
2ca00 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72  * * If in an err
2ca10 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2ca20 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  han SQLITE_FULL,
2ca30 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69   then task (1) i
2ca40 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65  s .**   performe
2ca50 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  d. If successful
2ca60 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61  , task (2). Rega
2ca70 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
2ca80 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69  tcome.**   of ei
2ca90 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20  ther, the error 
2caa0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
2cab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
2cac0 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  the caller.**   
2cad0 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c  (i.e. either SQL
2cae0 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
2caf0 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
2cb00 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67  .** * If the pag
2cb10 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52  er is in PAGER_R
2cb20 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
2cb30 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
2cb40 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72   Whether.**   or
2cb50 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63   not (1) is succ
2cb60 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74  ussful, also att
2cb70 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63  empt (2). If suc
2cb80 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
2cb90 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  **   SQLITE_OK. 
2cba0 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72  Otherwise, enter
2cbb0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2cbc0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2cbd0 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f  first .**   erro
2cbe0 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72  r code encounter
2cbf0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ed. .**.**   In 
2cc00 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2cc10 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
2cc20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  t the database w
2cc30 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a  as written to. .
2cc40 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20  **   So is safe 
2cc50 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2cc60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65  journal file eve
2cc70 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63  n if the playbac
2cc80 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69  k .**   (operati
2cc90 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f  on 1) failed. Ho
2cca0 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20  wever the pager 
2ccb0 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65  must enter the e
2ccc0 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
2ccd0 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
2cce0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
2ccf0 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73   cache are now s
2cd00 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20  uspect..**.** * 
2cd10 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50  Finally, if in P
2cd20 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73  AGER_EXCLUSIVE s
2cd30 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
2cd40 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20  pt (1). Only.** 
2cd50 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66    attempt (2) if
2cd60 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
2cd70 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ul. Return SQLIT
2cd80 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2cd90 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69  ul,.**   otherwi
2cda0 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  se enter the err
2cdb0 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2cdc0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
2cdd0 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  de from the .** 
2cde0 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74    failing operat
2cdf0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ion..**.**   In 
2ce00 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61  this case the da
2ce10 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
2ce20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2ce30 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a  n to. So if the.
2ce40 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70  **   playback op
2ce50 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2ce60 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64  succeed it would
2ce70 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
2ce80 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68  finalize.**   th
2ce90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2cea0 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  It needs to be l
2ceb0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
2cec0 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a  system so that.*
2ced0 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  *   some other p
2cee0 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69  rocess can use i
2cef0 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  t to restore the
2cf00 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20   database state 
2cf10 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75  (by.**   hot-jou
2cf20 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
2cf30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2cf40 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
2cf50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2cf60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cf70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cf80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2cf90 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43  e */.  PAGERTRAC
2cfa0 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E(("ROLLBACK %d\
2cfb0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2cfc0 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70 50  er)));.  if( !pP
2cfd0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2cfe0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
2cff0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2d000 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
2d010 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2d020 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2d030 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
2d040 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2d050 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
2d060 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
2d070 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
2d080 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2d090 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
2d0a0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
2d0b0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
2d0c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2d0d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2d0e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2d0f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2d100 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2d110 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
2d120 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2d130 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2d140 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
2d150 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
2d160 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2d170 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2d180 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
2d190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d1a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
2d1b0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
2d1c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2d1d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2d1e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2d1f0 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
2d200 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
2d210 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
2d220 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2d230 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2d240 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
2d250 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
2d260 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
2d270 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2d280 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
2d290 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
2d2a0 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
2d2b0 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
2d2c0 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
2d2d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2d2e0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
2d2f0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
2d300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d310 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2d320 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2d330 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
2d340 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
2d350 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
2d360 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
2d370 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
2d380 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
2d390 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
2d3a0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
2d3b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2d3c0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
2d3d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2d3e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2d3f0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2d400 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2d410 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
2d420 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d430 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d440 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2d450 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2d460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2d470 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2d480 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2d490 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2d4a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d4b0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2d4c0 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
2d4d0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2d4e0 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
2d4f0 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
2d500 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2d510 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
2d520 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2d530 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
2d540 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
2d550 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
2d560 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
2d570 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
2d580 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
2d590 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2d5a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2d5b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
2d5c0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2d5d0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
2d5e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2d5f0 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
2d600 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
2d610 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2d620 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
2d630 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f  r->dbSizeValid ?
2d640 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
2d650 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b  bSize : -1;.  a[
2d660 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
2d670 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
2d680 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2d690 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
2d6a0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
2d6b0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
2d6c0 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
2d6d0 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
2d6e0 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
2d6f0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
2d700 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
2d710 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
2d720 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
2d730 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2d740 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2d750 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
2d760 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d770 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67  PagerIsMemdb(Pag
2d780 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2d790 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a  eturn MEMDB;.}..
2d7a0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2d7b0 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65   there are at le
2d7c0 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73  ast nSavepoint s
2d7d0 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20  avepoints open. 
2d7e0 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  If there are.** 
2d7f0 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74  currently less t
2d800 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20  han nSavepoints 
2d810 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20  open, then open 
2d820 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
2d830 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b  points.** to mak
2d840 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65  e up the differe
2d850 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62  nce. If the numb
2d860 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
2d870 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65   is already.** e
2d880 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69  qual to nSavepoi
2d890 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  nt, then this fu
2d8a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2d8b0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  p..**.** If a me
2d8c0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2d8d0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
2d8e0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
2d8f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   If an error .**
2d900 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
2d910 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f  ening the sub-jo
2d920 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
2d930 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2d940 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  e is.** returned
2d950 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2d960 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
2d970 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
2d980 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
2d990 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76  pPager, int nSav
2d9a0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
2d9b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d9e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ode */.  int nCu
2d9f0 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  rrent = pPager->
2da00 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
2da10 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
2da20 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2da30 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61  ts */..  if( nSa
2da40 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74  vepoint>nCurrent
2da50 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
2da60 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
2da70 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2daa0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2dab0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
2dac0 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *aNew;         
2dad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2dae0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2daf0 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20 20  t array */..    
2db00 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65 20  /* Either there 
2db10 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f 75  is no active jou
2db20 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62 2d  rnal or the sub-
2db30 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2db40 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a  or .    ** the j
2db50 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73  ournal is always
2db60 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
2db70 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
2db80 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2db90 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65 6e  int==0 || isOpen
2dba0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2dbb0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  |.            pP
2dbc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2dbd0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2dbe0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a  MODE_MEMORY );..
2dbf0 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
2dc00 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
2dc10 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
2dc20 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
2dc30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
2dc40 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
2dc50 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
2dc60 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
2dc70 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
2dc80 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
2dc90 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2dca0 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
2dcb0 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
2dcc0 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
2dcd0 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
2dce0 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
2dcf0 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
2dd00 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
2dd10 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2dd20 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
2dd30 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
2dd40 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
2dd50 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
2dd60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dd70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2dd80 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
2dd90 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
2dda0 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
2ddb0 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
2ddc0 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
2ddd0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2dde0 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20  point = aNew;.  
2ddf0 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
2de00 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e  oint = nSavepoin
2de10 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  t;..    /* Popul
2de20 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76  ate the PagerSav
2de30 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
2de40 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64  s just allocated
2de50 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
2de60 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61  nCurrent; ii<nSa
2de70 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
2de80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2de90 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2dea0 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  d );.      aNew[
2deb0 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67  ii].nOrig = pPag
2dec0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2ded0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
2dee0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
2def0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
2df00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65  0 ){.        aNe
2df10 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20  w[ii].iOffset = 
2df20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2df30 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ff;.      }else{
2df40 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69  .        aNew[ii
2df50 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52  ].iOffset = JOUR
2df60 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
2df70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2df80 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52    aNew[ii].iSubR
2df90 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  ec = pPager->nSu
2dfa0 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77  bRec;.      aNew
2dfb0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2dfc0 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
2dfd0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
2dfe0 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  dbSize);.      i
2dff0 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e  f( !aNew[ii].pIn
2e000 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2e010 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e020 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2e030 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2e040 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2e050 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e  rnal, if it is n
2e060 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  ot already opene
2e070 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  d. */.    rc = o
2e080 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2e090 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
2e0a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e0b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e0c0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
2e0d0 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65  lback or release
2e0e0 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65   (commit) a save
2e0f0 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61  point..** The sa
2e100 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61  vepoint to relea
2e110 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  se or rollback n
2e120 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d  eed not be the m
2e130 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a  ost recently .**
2e140 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2e150 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  nt..**.** Parame
2e160 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73  ter op is always
2e170 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
2e180 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41  T_ROLLBACK or SA
2e190 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
2e1a0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56  .** If it is SAV
2e1b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
2e1c0 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64  then release and
2e1d0 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76   destroy the sav
2e1e0 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69  epoint with.** i
2e1f0 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e  ndex iSavepoint.
2e200 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
2e210 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
2e220 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  en rollback all 
2e230 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20  changes.** that 
2e240 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69  have occurred si
2e250 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65  nce the specifie
2e260 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20  d savepoint was 
2e270 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  created..**.** T
2e280 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20  he savepoint to 
2e290 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
2e2a0 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65  ase is identifie
2e2b0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a  d by parameter .
2e2c0 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41  ** iSavepoint. A
2e2d0 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e   value of 0 mean
2e2e0 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  s to operate on 
2e2f0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2e300 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20  vepoint.** (the 
2e310 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20  first created). 
2e320 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65  A value of (Page
2e330 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20  r.nSavepoint-1) 
2e340 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a  means operate.**
2e350 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
2e360 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61  ently created sa
2e370 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76  vepoint. If iSav
2e380 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
2e390 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72  r than.** (Pager
2e3a0 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20  .nSavepoint-1), 
2e3b0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2e3c0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2e3d0 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69  *.** If a negati
2e3e0 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ve value is pass
2e3f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2e400 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ion, then the cu
2e410 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
2e420 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
2e430 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
2e440 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e  ferent to callin
2e450 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
2e460 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63  erRollback() bec
2e470 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
2e480 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d  on does not term
2e490 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61  inate.** the tra
2e4a0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f  nsaction or unlo
2e4b0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
2e4c0 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65   it just restore
2e4d0 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  s the .** conten
2e4e0 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
2e4f0 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
2e500 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  al state. .**.**
2e510 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c   In any case, al
2e520 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74  l savepoints wit
2e530 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  h an index great
2e540 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69  er than iSavepoi
2e550 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72  nt .** are destr
2e560 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73  oyed. If this is
2e570 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61   a release opera
2e580 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f  tion (op==SAVEPO
2e590 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a  INT_RELEASE),.**
2e5a0 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   then savepoint 
2e5b0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c  iSavepoint is al
2e5c0 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  so destroyed..**
2e5d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2e5e0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2e5f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2e600 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2e610 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e   fails,.** or an
2e620 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2e630 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2e640 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69  curs while rolli
2e650 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61  ng back a .** sa
2e660 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65  vepoint. If no e
2e670 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c  rrors occur, SQL
2e680 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e690 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ed..*/ .int sqli
2e6a0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
2e6b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
2e6c0 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
2e6d0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2e6e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e6f0 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53  .  assert( op==S
2e700 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2e710 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2e720 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
2e730 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
2e740 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56  nt>=0 || op==SAV
2e750 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2e760 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70  );..  if( iSavep
2e770 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61  oint<pPager->nSa
2e780 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
2e790 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2e7a0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2e7b0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
2e7c0 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
2e7d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2e7e0 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e  maining savepoin
2e7f0 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70  ts after this op
2e800 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67  . */..    /* Fig
2e810 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
2e820 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c   savepoints will
2e830 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65   still be active
2e840 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20   after this.    
2e850 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74  ** operation. St
2e860 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ore this value i
2e870 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65  n nNew. Then fre
2e880 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f  e resources asso
2e890 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77  ciated .    ** w
2e8a0 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e  ith any savepoin
2e8b0 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74  ts that are dest
2e8c0 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70  royed by this op
2e8d0 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
2e8e0 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65      nNew = iSave
2e8f0 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56  point + (op==SAV
2e900 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
2e910 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65  ;.    for(ii=nNe
2e920 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  w; ii<pPager->nS
2e930 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2e940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
2e950 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
2e960 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
2e970 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
2e980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
2e990 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
2e9a0 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49   nNew;..    /* I
2e9b0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
2e9c0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20  back operation, 
2e9d0 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65  playback the spe
2e9e0 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
2e9f0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
2ea00 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c   is a temp-file,
2ea10 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2ea20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2ea30 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a   file has.    **
2ea40 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2ea50 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
2ea60 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65  se there have be
2ea70 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
2ea80 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
2ea90 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68  base file, so th
2eaa0 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61  e playback opera
2eab0 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70  tion can be skip
2eac0 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ped..    */.    
2ead0 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
2eae0 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69 73  T_ROLLBACK && is
2eaf0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2eb00 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
2eb10 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
2eb20 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30  point = (nNew==0
2eb30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61  )?0:&pPager->aSa
2eb40 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b  vepoint[nNew-1];
2eb50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2eb60 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
2eb70 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65  nt(pPager, pSave
2eb80 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73  point);.      as
2eb90 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f  sert(rc!=SQLITE_
2eba0 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  DONE);.    }.  .
2ebb0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2ebc0 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74  s a release of t
2ebd0 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
2ebe0 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65  epoint, truncate
2ebf0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
2ec00 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f  -journal to zero
2ec10 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
2ec20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  */.    if( nNew=
2ec30 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  =0 && op==SAVEPO
2ec40 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20 69  INT_RELEASE && i
2ec50 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2ec60 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
2ec70 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2ec80 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  OK );.      rc =
2ec90 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
2eca0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2ecb0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65   0);.      pPage
2ecc0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
2ecd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ece0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ecf0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
2ed00 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
2ed10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2ed20 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2ed30 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
2ed40 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
2ed50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2ed60 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
2ed70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ed80 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
2ed90 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
2eda0 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
2edb0 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
2edc0 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
2edd0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2ede0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
2edf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2ee00 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
2ee10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ee20 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
2ee30 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
2ee40 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
2ee50 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
2ee60 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
2ee70 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
2ee80 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
2ee90 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
2eea0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
2eeb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2eec0 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
2eed0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2eee0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2eef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
2ef00 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2ef10 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
2ef20 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
2ef30 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2ef40 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
2ef50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ef60 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
2ef70 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
2ef80 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
2ef90 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
2efa0 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
2efb0 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
2efc0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
2efd0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
2efe0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2eff0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2f000 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
2f010 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
2f020 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
2f030 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
2f040 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
2f050 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2f060 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
2f070 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
2f080 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
2f090 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
2f0a0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
2f0b0 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
2f0c0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
2f0d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
2f0e0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
2f0f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
2f100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f110 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
2f120 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
2f130 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
2f140 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
2f150 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
2f160 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
2f170 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
2f180 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
2f190 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
2f1a0 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
2f1b0 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
2f1c0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
2f1d0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
2f1e0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
2f1f0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
2f200 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
2f210 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
2f220 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
2f230 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
2f240 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
2f250 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2f260 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
2f270 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
2f280 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
2f290 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
2f2a0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
2f2b0 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
2f2c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
2f2d0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
2f2e0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
2f2f0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
2f300 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
2f310 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
2f320 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
2f330 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
2f340 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
2f350 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2f360 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
2f370 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
2f380 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
2f390 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
2f3a0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
2f3b0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
2f3c0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2f3d0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
2f3e0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
2f3f0 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
2f400 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
2f410 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2f420 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
2f430 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
2f440 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
2f450 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2f460 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
2f470 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
2f480 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
2f490 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
2f4a0 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
2f4b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
2f4c0 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
2f4d0 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
2f4e0 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
2f4f0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
2f500 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
2f510 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
2f520 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
2f530 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
2f540 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
2f550 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
2f560 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2f570 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
2f580 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
2f590 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
2f5a0 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72  ** occurs. Other
2f5b0 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73  wise, it returns
2f5c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
2f5d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
2f5e0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
2f5f0 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
2f600 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
2f610 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
2f620 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
2f630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f640 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
2f650 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
2f660 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
2f670 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  no = 0;       /*
2f680 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50   Old value of pP
2f690 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63  g->pgno, if sync
2f6a0 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
2f6b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f6d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2f6e0 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f  .  Pgno origPgno
2f6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f700 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
2f710 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  page number */..
2f720 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
2f730 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  Ref>0 );..  /* I
2f740 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
2f750 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20   moved is dirty 
2f760 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  and has not been
2f770 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61   saved by the la
2f780 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f  test.  ** savepo
2f790 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74  int, then save t
2f7a0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
2f7b0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2f7c0 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
2f7d0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20  ub-journal now. 
2f7e0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
2f7f0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66   to handle the f
2f800 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
2f810 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42  o:.  **.  **   B
2f820 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c  EGIN;.  **     <
2f830 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20  journal page X, 
2f840 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69  then modify it i
2f850 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20  n memory>.  **  
2f860 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
2f870 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f  ;.  **       <Mo
2f880 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63  ve page X to loc
2f890 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20  ation Y>.  **   
2f8a0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2f8b0 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e;.  **.  ** If 
2f8c0 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20  page X were not 
2f8d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
2f8e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c  ub-journal here,
2f8f0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20   it would not.  
2f900 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
2f910 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f  o restore its co
2f920 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20  ntents when the 
2f930 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65  "ROLLBACK TO one
2f940 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ".  ** statement
2f950 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73   were is process
2f960 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75  ed..  **.  ** su
2f970 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d  bjournalPage() m
2f980 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63  ay need to alloc
2f990 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f  ate space to sto
2f9a0 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74  re pPg->pgno int
2f9b0 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  o.  ** one or mo
2f9c0 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74  re savepoint bit
2f9d0 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68  vecs. This is th
2f9e0 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75  e reason this fu
2f9f0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20  nction.  ** may 
2fa00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2fa10 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MEM..  */.  if( 
2fa20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2fa30 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73 75  _DIRTY .   && su
2fa40 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2fa50 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
2fa60 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
2fa70 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
2fa80 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2fa90 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2faa0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
2fab0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
2fac0 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
2fad0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
2fae0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2faf0 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
2fb00 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2fb10 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
2fb20 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
2fb30 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
2fb40 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2fb50 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a  no, pgno))..  /*
2fb60 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2fb70 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
2fb80 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
2fb90 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
2fba0 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
2fbb0 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
2fbc0 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
2fbd0 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
2fbe0 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
2fbf0 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
2fc00 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
2fc10 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
2fc20 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
2fc30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
2fc40 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
2fc50 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
2fc60 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
2fc70 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
2fc80 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
2fc90 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
2fca0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
2fcb0 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
2fcc0 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
2fcd0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2fce0 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
2fcf0 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
2fd00 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
2fd10 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
2fd20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2fd30 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
2fd40 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2fd50 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
2fd60 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2fd70 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
2fd80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fd90 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
2fda0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
2fdb0 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
2fdc0 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
2fdd0 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
2fde0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
2fdf0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
2fe00 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
2fe10 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
2fe20 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
2fe30 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
2fe40 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
2fe50 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
2fe60 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
2fe70 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
2fe80 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
2fe90 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
2fea0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
2feb0 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
2fec0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2fed0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
2fee0 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
2fef0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
2ff00 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
2ff10 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2ff20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
2ff30 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2ff40 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  C);.    sqlite3P
2ff50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
2ff60 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67  );.  }..  origPg
2ff70 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
2ff80 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2ff90 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
2ffa0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2ffb0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
2ffc0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2ffd0 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
2ffe0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
2fff0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
30000 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
30010 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
30020 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
30030 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
30040 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
30050 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
30060 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
30070 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
30080 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
30090 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
300a0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
300b0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
300c0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
300d0 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
300e0 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
300f0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
30100 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
30110 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
30120 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
30130 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
30140 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
30150 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
30160 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
30170 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
30180 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
30190 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
301a0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
301b0 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
301c0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
301d0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
301e0 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
301f0 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
30200 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
30210 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
30220 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
30230 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
30240 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
30250 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
30260 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
30270 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
30280 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
30290 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
302a0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
302b0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
302c0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
302d0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
302e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
302f0 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
30300 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
30310 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
30320 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
30330 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
30340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
30350 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
30360 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
30370 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
30380 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
30390 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
303a0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
303b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
303c0 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
303d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
303e0 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
303f0 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
30400 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30420 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
30430 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64 53 79  ournal && needSy
30440 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
30450 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
30460 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
30470 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
30480 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
30490 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20  dSyncPgno);.    
304a0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
304b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
304c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
304d0 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
304e0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
304f0 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  =0 && !MEMDB );.
30500 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67      pPgHdr->flag
30510 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
30520 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  SYNC;.    sqlite
30530 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
30540 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
30550 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30560 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
30570 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69  /*.  ** For an i
30580 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
30590 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
305a0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
305b0 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f  ontinues.  ** to
305c0 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20   exist, in case 
305d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
305e0 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61  needs to roll ba
305f0 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63 61 74 65  ck.  We allocate
30600 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  .  ** the page n
30610 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ow, instead of a
30620 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62 65 63 61  t rollback, beca
30630 75 73 65 20 77 65 20 63 61 6e 20 62 65 74 74 65  use we can bette
30640 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77 69 74 68  r deal.  ** with
30650 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
30660 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20 20 54 69  y error now.  Ti
30670 63 6b 65 74 20 23 33 37 36 31 2e 0a 20 20 2a 2f  cket #3761..  */
30680 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
30690 20 20 20 20 44 62 50 61 67 65 20 2a 70 4e 65 77      DbPage *pNew
306a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
306b0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
306c0 50 61 67 65 72 2c 20 6f 72 69 67 50 67 6e 6f 2c  Pager, origPgno,
306d0 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20   &pNew, 1);.    
306e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
306f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
30700 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
30710 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  nref(pNew);.  }.
30720 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30730 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
30740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
30750 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
30760 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
30770 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
30780 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
30790 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
307a0 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
307b0 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50  Pg->nRef>0 || pP
307c0 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
307d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
307e0 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
307f0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
30800 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
30810 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
30820 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
30830 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
30840 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
30850 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
30860 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
30870 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
30880 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
30890 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
308a0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
308b0 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74  pPager?pPg->pExt
308c0 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ra:0);.}../*.** 
308d0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
308e0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
308f0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
30900 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
30910 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
30920 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
30930 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
30940 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
30950 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
30960 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
30970 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
30980 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
30990 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
309a0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
309b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
309c0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
309d0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
309e0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
309f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
30a00 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
30a10 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
30a20 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
30a30 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
30a40 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
30a50 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
30a60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
30a70 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
30a80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
30a90 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
30aa0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
30ab0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30ac0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
30ad0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
30ae0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
30af0 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
30b00 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
30b10 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
30b20 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
30b30 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
30b40 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
30b50 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
30b60 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
30b70 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
30b80 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
30b90 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
30ba0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
30bb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
30bc0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
30bd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
30be0 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
30bf0 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
30c00 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
30c10 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
30c20 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
30c30 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
30c40 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
30c50 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
30c60 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
30c70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
30c80 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
30c90 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
30ca0 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
30cb0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
30cc0 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
30cd0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
30ce0 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
30cf0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
30d00 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
30d10 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
30d20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
30d30 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
30d40 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20  QUERY, then the 
30d50 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20  journal_mode is 
30d60 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61  set to the.** va
30d70 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66  lue specified if
30d80 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
30d90 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68 61  llowed.  The cha
30da0 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  nge is disallowe
30db0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c  d.** for the fol
30dc0 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
30dd0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
30de0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
30df0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
30e00 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
30e10 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
30e20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
30e30 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a  **.**   *  The j
30e40 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20  ournal mode may 
30e50 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77  not be changed w
30e60 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69  hile a transacti
30e70 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
30e80 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
30e90 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
30ea0 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
30eb0 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
30ec0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
30ed0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
30ee0 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
30ef0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
30f00 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
30f10 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
30f20 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
30f30 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
30f40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30f50 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
30f60 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
30f70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30f80 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
30f90 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
30fa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30fb0 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
30fc0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
30fd0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30fe0 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
30ff0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
31000 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
31010 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72  EMORY );.  asser
31020 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
31030 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
31040 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20    if( eMode>=0. 
31050 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20    && (!MEMDB || 
31060 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
31070 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
31080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
31090 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
310a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a  OURNALMODE_OFF).
310b0 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64     && !pPager->d
310c0 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20  bModified.   && 
310d0 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
310e0 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67  >jfd) || 0==pPag
310f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a  er->journalOff).
31100 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f    ){.    if( isO
31110 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31130 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
31140 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >jfd);.    }.   
31150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31160 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
31170 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
31180 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
31190 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
311a0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
311b0 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
311c0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
311d0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
311e0 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
311f0 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
31200 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
31210 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
31220 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
31230 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
31240 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
31250 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
31260 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
31270 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
31280 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
31290 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
312a0 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
312b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
312c0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
312d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
312e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
312f0 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
31300 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31310 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
31320 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
31330 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
31340 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
31350 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
31360 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
31370 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
31380 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
31390 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
313a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
313b0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
313c0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
313d0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
313e0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
313f0 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
31400 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
31410 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
31420 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
31430 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65  ->pBackup;.}..#e
31440 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31450 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.