/ Hex Artifact Content
Login

Artifact 9838393b4a5118eb935ac0939621177157a38bc1:


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 36 31  : pager.c,v 1.61
0350: 30 20 32 30 30 39 2f 30 37 2f 32 31 20 31 39 3a  0 2009/07/21 19:
0360: 32 35 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37  25:24 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 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1180: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1190: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
11a0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
11b0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
11c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
11d0: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
11e0: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
11f0: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
1200: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
1210: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
1220: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
1230: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
1240: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1250: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
1260: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
1290: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
12a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
12b0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
12c0: 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66  r size. 16MB. If
12d0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
12e0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
12f0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
1300: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
1310: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
1320: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
1330: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
1340: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
1350: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
1360: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
1370: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
1380: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
1390: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
13a0: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
13b0: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
13c0: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
13d0: 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f  IZE 0x0100000../
13e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
13f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1400: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
1410: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
1420: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65  h active.** save
1430: 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d  point and statem
1440: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1450: 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41  in the system. A
1460: 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72  ll such structur
1470: 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
1480: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
1490: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
14a0: 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63  , which is alloc
14b0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69  ated and.** resi
14c0: 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zed using sqlite
14d0: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3Realloc()..**.*
14e0: 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  * When a savepoi
14f0: 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74  nt is created, t
1500: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1510: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
1520: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
1530: 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  0. If a journal-
1540: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1550: 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  n into the main 
1560: 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a  journal while.**
1570: 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
1580: 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69  s active, then i
1590: 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
15a0: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
15b0: 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  set .** immediat
15c0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
15d0: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72  e last journal r
15e0: 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e  ecord written in
15f0: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  to the main.** j
1600: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68  ournal before th
1610: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
1620: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1630: 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f  ed during savepo
1640: 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  int.** rollback 
1650: 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61  (see pagerPlayba
1660: 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a  ckSavepoint())..
1670: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1680: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1690: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b   PagerSavepoint;
16a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76  .struct PagerSav
16b0: 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69  epoint {.  i64 i
16c0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
16d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
16e0: 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61  ing offset in ma
16f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1700: 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20  i64 iHdrOffset; 
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1720: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42  See above */.  B
1730: 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f  itvec *pInSavepo
1740: 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  int;        /* S
1750: 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  et of pages in t
1760: 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f  his savepoint */
1770: 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20  .  Pgno nOrig;  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62  /* Original numb
17a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66  er of pages in f
17b0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53  ile */.  Pgno iS
17c0: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
17d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17e0: 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  f first record i
17f0: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  n sub-journal */
1800: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
1810: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
1820: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1840: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72  ucture..**.** er
1850: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61  rCode.**.**   Pa
1860: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
1870: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1880: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
1890: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20  ORRUPT, or.**   
18a0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
18b0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
18c0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
18d0: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
18e0: 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20  rsists.**   and 
18f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
1900: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
1910: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
1920: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
1930: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72     SQLITE_FULL r
1940: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
1950: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
1960: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
1970: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
1980: 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75    next successfu
1990: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
19a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
19b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
19c0: 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55  ,.**   SQLITE_FU
19d0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
19e0: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
19f0: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1a00: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1a10: 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65  ).**   APIs, the
1a20: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
1a30: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
1a40: 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61  ..**.** dbSizeVa
1a50: 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f  lid, dbSize, dbO
1a60: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
1a70: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61  ize.**.**   Mana
1a80: 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ging the size of
1a90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa0: 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61  le in pages is a
1ab0: 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61   little complica
1ac0: 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61  ted..**   The va
1ad0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53  riable Pager.dbS
1ae0: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
1af0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b00: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1b10: 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75  se.**   image cu
1b20: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1b30: 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73  . As the databas
1b40: 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72  e image grows or
1b50: 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a   shrinks this.**
1b60: 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75     variable is u
1b70: 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69  pdated. The vari
1b80: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c  able Pager.dbFil
1b90: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
1ba0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
1bb0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bd0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1be0: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1bf0: 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f  bSize.**   if so
1c00: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1c10: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1c20: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1c30: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1c40: 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66  itten.**   out f
1c50: 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f  rom the cache to
1c60: 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1c70: 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20   on disk. Or if 
1c80: 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65  the image has be
1c90: 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65  en.**   truncate
1ca0: 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e  d by an incremen
1cb0: 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  tal-vacuum opera
1cc0: 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e  tion. The Pager.
1cd0: 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61  dbOrigSize varia
1ce0: 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e  ble.**   contain
1cf0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1d10: 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e  abase image when
1d20: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d30: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61    transaction wa
1d40: 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f  s opened. The co
1d50: 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
1d60: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72  ree of these var
1d70: 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f  iables is.**   o
1d80: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74  nly guaranteed t
1d90: 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20  o be correct if 
1da0: 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65  the boolean Page
1db0: 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73  r.dbSizeValid is
1dc0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54   true..**.**   T
1dd0: 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20  ODO: Under what 
1de0: 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62  conditions is db
1df0: 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43  SizeValid set? C
1e00: 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68  leared?.**.** ch
1e10: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a  angeCountDone.**
1e20: 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65  .**   This boole
1e30: 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  an variable is u
1e40: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1e50: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   that the change
1e60: 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28  -counter .**   (
1e70: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
1e80: 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20  r field at byte 
1e90: 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
1ea0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1eb0: 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64  is .**   not upd
1ec0: 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20  ated more often 
1ed0: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20  than necessary. 
1ee0: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73  .**.**   It is s
1ef0: 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20  et to true when 
1f00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1f10: 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  er field is upda
1f20: 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20  ted, which .**  
1f30: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
1f40: 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65   if an exclusive
1f50: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1f60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f70: 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  le..**   It is c
1f80: 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66  leared (set to f
1f90: 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61  alse) whenever a
1fa0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1fb0: 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71   is .**   relinq
1fc0: 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61  uished on the da
1fd0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63  tabase file. Eac
1fe0: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
1ff0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2000: 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e  d,.**   The chan
2010: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
2020: 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49   is inspected. I
2030: 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68  f it is true, th
2040: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75  e work of.**   u
2050: 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e  pdating the chan
2060: 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d  ge-counter is om
2070: 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75  itted for the cu
2080: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2090: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  n..**.**   This 
20a0: 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20  mechanism means 
20b0: 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  that when runnin
20c0: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
20d0: 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ode, a connectio
20e0: 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c  n .**   need onl
20f0: 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  y update the cha
2100: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65  nge-counter once
2110: 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  , for the first 
2120: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2130: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2140: 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a  * dbModified.**.
2150: 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66  **   The dbModif
2160: 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ied flag is set 
2170: 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62  whenever a datab
2180: 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74  ase page is dirt
2190: 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ied..**   It is 
21a0: 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65  cleared at the e
21b0: 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73  nd of each trans
21c0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
21d0: 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  It is used when 
21e0: 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74  committing or ot
21f0: 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61  herwise ending a
2200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2210: 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69  .**   the dbModi
2220: 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65  fied flag is cle
2230: 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72  ar then less wor
2240: 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  k has to be done
2250: 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53  ..**.** journalS
2260: 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54  tarted.**.**   T
2270: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  his flag is set 
2280: 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65  whenever the the
2290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
22a0: 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
22b0: 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74    The point of t
22c0: 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74  his flag is that
22d0: 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20   it must be set 
22e0: 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20  after the .**   
22f0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
2300: 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61  ader in a journa
2310: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2320: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
2330: 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20  **   After this 
2340: 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65  has happened, ne
2350: 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64  w pages appended
2360: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2370: 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65   .**   do not ne
2380: 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ed the PGHDR_NEE
2390: 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c  D_SYNC flag set,
23a0: 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   as they do not 
23b0: 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69  need.**   to wai
23c0: 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  t for a journal 
23d0: 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79  sync before they
23e0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
23f0: 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  out to.**   the 
2400: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73  database file (s
2410: 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ee function page
2420: 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20  r_write())..**  
2430: 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a   .** setMaster.*
2440: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
2450: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2460: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2470: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2480: 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69  ile name.**   (i
2490: 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77  f any) is only w
24a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63  journal file onc
24c0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  e..**.**   When 
24d0: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
24e0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61  nsaction, the ma
24f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2500: 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a  e name (if any).
2510: 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74  **   may be writ
2520: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20  rnal file while 
2540: 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
2550: 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52  ll in.**   PAGER
2560: 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20  _RESERVED state 
2570: 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65  (see CommitPhase
2580: 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63  One() for the ac
2590: 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74  tion). It.**   t
25a0: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
25b0: 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78  upgrade to an ex
25c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66  clusive lock. If
25d0: 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a   this attempt.**
25e0: 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53     fails, then S
25f0: 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62  QLITE_BUSY may b
2600: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
2610: 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75  e user and the u
2620: 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74  ser.**   may att
2630: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
2640: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
2650: 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c  gain later (call
2660: 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50  ing.**   CommitP
2670: 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29  haseOne() again)
2680: 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75  . This flag is u
2690: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
26a0: 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73  at the .**   mas
26b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
26c0: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
26d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26e0: 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a  file the first.*
26f0: 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50  *   time CommitP
2700: 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c  haseOne() is cal
2710: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74  led..**.** doNot
2720: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Sync.**.**   Thi
2730: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  s variable is se
2740: 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  t and cleared by
2750: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2760: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  te()..**.** need
2770: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  Sync.**.**   TOD
2780: 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20 65  O: It might be e
2790: 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68 69  asier to set thi
27a0: 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72  s variable in wr
27b0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a  iteJournalHdr().
27c0: 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61  **   and writeMa
27d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e  sterJournal() on
27e0: 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d  ly. Change its m
27f0: 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e  eaning to "unsyn
2800: 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61  ced data.**   ha
2810: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2820: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a  o the journal"..
2830: 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f  **.** subjInMemo
2840: 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ry.**.**   This 
2850: 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72  is a boolean var
2860: 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20  iable. If true, 
2870: 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
2880: 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  d sub-journal.**
2890: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20     is opened as 
28a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
28b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61  rnal file. If fa
28c0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d  lse, then in-mem
28d0: 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75  ory.**   sub-jou
28e0: 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75  rnals are only u
28f0: 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  sed for in-memor
2900: 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a  y pager files..*
2910: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2920: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2930: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
2940: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
2950: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
2960: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
2970: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
2980: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
2990: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
29a0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
29b0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
29c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
29d0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
29e0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
29f0: 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  es */.  u8 useJo
2a00: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2a10: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2a20: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2a30: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2a40: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a60: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2a70: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2a80: 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b   */.  u8 noSync;
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
2ab0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
2ac0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
2ad0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
2ae0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
2af0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
2b00: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2b10: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
2b20: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
2b30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2b40: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
2b50: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
2b60: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
2b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
2b80: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
2b90: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
2ba0: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2bd0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2be0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c00: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2c10: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2c20: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..  /* The foll
2c30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
2c40: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
2c50: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61 72   members that ar
2c60: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
2c70: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ** modified duri
2c80: 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ng normal operat
2c90: 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20  ions. The other 
2ca0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69  variables in thi
2cb0: 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  s structure.  **
2cc0: 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73   are either cons
2cd0: 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20  tant throughout 
2ce0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20  the lifetime of 
2cf0: 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c  the pager, or el
2d00: 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  se.  ** used to 
2d10: 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74  store configurat
2d20: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74  ion parameters t
2d30: 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20 77  hat affect the w
2d40: 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20 20  ay the pager .  
2d50: 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a  ** operates..  *
2d60: 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74  *.  ** The 'stat
2d70: 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20 64  e' variable is d
2d80: 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65  escribed in more
2d90: 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69   detail along wi
2da0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63  th the.  ** desc
2db0: 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  riptions of the 
2dc0: 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61  values it may ta
2dd0: 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ke - PAGER_UNLOC
2de0: 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74  K etc. Many of t
2df0: 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61  he.  ** other va
2e00: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
2e10: 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69  block are descri
2e20: 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  bed in the comme
2e30: 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a  nt directly .  *
2e40: 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61  * above this cla
2e50: 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20  ss definition.. 
2e60: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
2e90: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2ea0: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2eb0: 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20   u8 dbModified; 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed0: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72  True if there ar
2ee0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
2ef0: 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20   the Db */.  u8 
2f00: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f20: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2f30: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2f40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2f50: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f70: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
2f80: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2f90: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
2fa0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
2fb0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
2fc0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2fd0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
2fe0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3000: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
3010: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
3020: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
3030: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b  .  u8 doNotSync;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3050: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65  * Boolean. While
3060: 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70   true, do not sp
3070: 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f  ill the cache */
3080: 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69  .  u8 dbSizeVali
3090: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
30a0: 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a  * Set when dbSiz
30b0: 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a  e is correct */.
30c0: 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72    u8 subjInMemor
30d0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
30e0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d   True to use in-
30f0: 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
3100: 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  als */.  Pgno db
3110: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3130: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3140: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
3150: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
3160: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
3170: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
3180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
3190: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
31a0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
31b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
31d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
31e0: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3200: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
3210: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
3220: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3240: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
3250: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
3260: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
3270: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
3280: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3290: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
32a0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
32b0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
32c0: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
32f0: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
3300: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
3310: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
3320: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
3330: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3340: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3350: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
3360: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3380: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
3390: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
33a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
33b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
33c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
33d0: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
33e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
33f0: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
3400: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
3410: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
3420: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3430: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3440: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3450: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
3460: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3470: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3480: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
3490: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
34a0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
34b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
34c0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34d0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
34e0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
34f0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
3500: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3520: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3530: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
3540: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  ] */.  char dbFi
3550: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
3560: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
3570: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
3580: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
3590: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
35b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
35c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
35d0: 62 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e  back */..  u16 n
35e0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
35f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3600: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
3610: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
3620: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
3630: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
3640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3650: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
3660: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
3670: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
3680: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
3690: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
36a0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
36b0: 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70  pen() */.  int p
36c0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
36d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
36f0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  age */.  Pgno mx
3700: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
3710: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
3720: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
3730: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3740: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
3750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3760: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3770: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3780: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
37b0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
37c0: 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
37d0: 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63  (void*); /* Func
37e0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65  tion to call whe
37f0: 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64  n busy */.  void
3800: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
3810: 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  g;      /* Conte
3820: 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  xt argument for 
3830: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
3840: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3850: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3860: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
3870: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
3880: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
3890: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
38a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
38b0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
38c0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
38d0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
38e0: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
38f0: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3900: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3910: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3920: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
3930: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
3940: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
3950: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
3960: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
3970: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
3980: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3990: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
39a0: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
39b0: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
39c0: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
39d0: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
39e0: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
3a00: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
3a10: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
3a20: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
3a30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3a40: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3a50: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
3a60: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
3a70: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
3a80: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
3a90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
3aa0: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
3ab0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3ac0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
3ad0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
3ae0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
3af0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
3b00: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
3b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3b20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
3b30: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
3b40: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
3b50: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
3b60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
3b70: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
3b80: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
3b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
3ba0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
3bb0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
3bc0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
3bd0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
3be0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
3bf0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
3c00: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
3c10: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
3c20: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
3c30: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
3c40: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
3c50: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3c60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3c70: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
3c80: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3c90: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
3ca0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
3cb0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3cc0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
3cd0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
3ce0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
3cf0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
3d00: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3d10: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
3d20: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3d30: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
3d40: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
3d50: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
3d60: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
3d70: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
3d80: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
3d90: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3da0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3db0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3dc0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3dd0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
3de0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
3df0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
3e00: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
3e10: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
3e20: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
3e30: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
3e40: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
3e50: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
3e60: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
3e70: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
3e80: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
3e90: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3ea0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
3eb0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3ec0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3ed0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
3ee0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
3ef0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
3f00: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
3f10: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
3f20: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
3f30: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
3f40: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
3f50: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
3f60: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
3f70: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
3f80: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
3f90: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3fa0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3fb0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3fc0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3fd0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3fe0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3ff0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
4000: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
4010: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
4020: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
4030: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
4040: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
4050: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
4060: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
4070: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
4080: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
4090: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
40a0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
40b0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
40c0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
40d0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
40e0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
40f0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
4100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
4110: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
4120: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
4130: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
4140: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
4150: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
4160: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
4170: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
4180: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
4190: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
41a0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
41b0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
41c0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
41d0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
41e0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
41f0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
4200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
4210: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
4220: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
4230: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
4240: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
4250: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
4260: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
4270: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
4280: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
4290: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
42a0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
42b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
42c0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
42d0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
42e0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
42f0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
4300: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
4310: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
4320: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
4330: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
4340: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
4350: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
4360: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
4370: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
4380: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
4390: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
43a0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
43b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
43c0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
43d0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
43e0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
43f0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
4400: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
4410: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
4420: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
4430: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4440: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4450: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4460: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4470: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
4480: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
4490: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
44a0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
44b0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
44c0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
44d0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
44e0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
44f0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4500: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4510: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4520: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4530: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4540: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4550: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4560: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4580: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
4590: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
45a0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
45b0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
45c0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
45d0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
45e0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
45f0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4600: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4610: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
4620: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
4630: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
4640: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
4650: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
4660: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
4670: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
4680: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
4690: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
46a0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
46b0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
46c0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
46d0: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
46e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
46f0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
4700: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
4710: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
4720: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
4730: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
4740: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
4750: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
4760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4770: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
4780: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
4790: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
47a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
47b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
47c0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
47d0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
47e0: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
47f0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
4800: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
4810: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
4820: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
4830: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
4840: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
4850: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
4860: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
4870: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
4880: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
4890: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
48a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
48b0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
48c0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
48d0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
48e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
48f0: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
4900: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
4910: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
4920: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
4930: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
4940: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
4950: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4960: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
4970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4990: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
49a0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
49b0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
49c0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
49d0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
49e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
49f0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
4a00: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4a10: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
4a20: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
4a30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
4a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4a60: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
4a70: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
4a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
4a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4aa0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
4ab0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
4ac0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
4ad0: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
4ae0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
4af0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
4b00: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4b10: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4b20: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4b30: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4b40: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4b50: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4b60: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4b70: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4b80: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4b90: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4ba0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4bb0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4bc0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4bd0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4be0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4c00: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
4c10: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
4c20: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
4c30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4c40: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
4c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4c60: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
4c70: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
4c80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4c90: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4ca0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
4cb0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
4cc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4cd0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4ce0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
4cf0: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
4d00: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
4d10: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
4d20: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
4d30: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
4d40: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
4d50: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4d60: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4d70: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d80: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4d90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4da0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4db0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4dc0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4dd0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
4de0: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
4df0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4e00: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
4e10: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4e20: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4e30: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4e40: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4e50: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
4e60: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
4e70: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
4e80: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
4e90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
4ea0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
4eb0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
4ec0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
4ed0: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
4ee0: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
4ef0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
4f00: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
4f10: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
4f20: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
4f30: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
4f40: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
4f50: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
4f60: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
4f70: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
4f80: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
4f90: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
4fa0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
4fb0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
4fc0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
4fd0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
4fe0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
5000: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
5010: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
5020: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
5030: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
5040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
5060: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
5070: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
5080: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5090: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
50a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
50b0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
50c0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
50d0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
50e0: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
50f0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
5100: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
5110: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
5120: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
5130: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
5140: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
5150: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
5160: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
5170: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
5180: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
5190: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
51a0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
51b0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
51c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
51d0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
51e0: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
51f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
5200: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
5210: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
5220: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
5230: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
5240: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
5250: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
5260: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
5270: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
5280: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5290: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
52a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
52b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
52c0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
52d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
52e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
52f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
5300: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
5310: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
5320: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
5330: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
5340: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
5350: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
5360: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
5370: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
5380: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5390: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
53a0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
53b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
53c0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
53f0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
5400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
5410: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
5420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
5430: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
5440: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
5470: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
5480: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
5490: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
54a0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
54b0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
54c0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
54d0: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
54e0: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
54f0: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
5500: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
5510: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
5520: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
5530: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
5540: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
5550: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
5560: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
5570: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
5580: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
5590: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
55a0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
55b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
55c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
55d0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
55e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
55f0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5600: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
5610: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
5620: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
5630: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
5640: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
5650: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
5660: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
5670: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
5680: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
5690: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
56a0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
56b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
56c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
56d0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
56e0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
56f0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
5700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
5710: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
5720: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
5730: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
5740: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
5750: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5760: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
5770: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
5780: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
5790: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
57a0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
57b0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
57c0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
57d0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
57e0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
57f0: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
5800: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
5810: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
5820: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
5830: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
5840: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
5850: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
5860: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
5870: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
5880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5890: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
58a0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
58b0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
58c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
58d0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
58e0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
58f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
5900: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
5910: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
5920: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
5930: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
5940: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5950: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5960: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5970: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5980: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5990: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
59a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
59b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
59c0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
59d0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
59e0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
59f0: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
5a00: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
5a10: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
5a20: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
5a40: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
5a50: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
5a60: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
5a70: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
5a80: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
5a90: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5aa0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
5ab0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
5ac0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
5ad0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
5ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
5af0: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
5b00: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
5b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
5b20: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
5b30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5b40: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
5b50: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
5b60: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
5b70: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
5b80: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
5b90: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
5ba0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
5bb0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
5bc0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5bd0: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
5be0: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
5bf0: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
5c00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5c20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5c30: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
5c40: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
5c50: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
5c60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
5c70: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
5c80: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
5c90: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
5ca0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
5cb0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
5cc0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
5cd0: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
5ce0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5cf0: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
5d00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
5d10: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
5d20: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
5d30: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
5d40: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
5d50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
5d60: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
5d70: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
5d80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d90: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
5da0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
5db0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
5dc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5dd0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5de0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
5df0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
5e00: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
5e10: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
5e20: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
5e30: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
5e40: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
5e50: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
5e60: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
5e70: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
5e80: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
5e90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
5ea0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
5eb0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
5ec0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5ed0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5ee0: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
5ef0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5f00: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5f10: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
5f20: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5f30: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
5f40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
5f50: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
5f60: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
5f70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5f80: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5f90: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5fa0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5fb0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5fc0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5fd0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
5ff0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
6000: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
6010: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6020: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
6030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6040: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
6070: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
6080: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
6090: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
60c0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
60d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
60e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
60f0: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
6100: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
6110: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6120: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
6130: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6140: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6150: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
6160: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
6170: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
6180: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6190: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
61a0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
61b0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
61c0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
61d0: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
61e0: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
61f0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
6200: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6210: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6220: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
6230: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
6240: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
6250: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6260: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
6270: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
6280: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6290: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
62a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
62b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
62c0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
62d0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
62e0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
62f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
6300: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
6310: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
6320: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6330: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
6340: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
6350: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
6360: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
6370: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
6380: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
6390: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
63a0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
63b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
63c0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
63d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
63e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
63f0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
6400: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
6410: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
6420: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
6430: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
6440: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
6450: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
6460: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6470: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
6480: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
6490: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
64a0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
64c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
64d0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
64e0: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
64f0: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
6500: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
6510: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
6520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6530: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
6540: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
6550: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6560: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
6570: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
6580: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
6590: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
65a0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
65b0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
65c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
65f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6600: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
6610: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
6620: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6630: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6650: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
6680: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
6690: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
66a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
66b0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
66c0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
66d0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
66e0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
66f0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
6700: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
6710: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
6720: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6730: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
6740: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
6750: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
6760: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6770: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
6780: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
6790: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
67a0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
67b0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
67c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
67d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
67e0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
67f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
6800: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6810: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
6820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
6830: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
6840: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
6850: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6860: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
6870: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
6880: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
6890: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
68a0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
68b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
68c0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
68d0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
68e0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
68f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
6900: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
6910: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
6920: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
6930: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
6940: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
6950: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
6960: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
6970: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
6980: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
6990: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
69a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
69b0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
69c0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
69d0: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
69e0: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
69f0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
6a00: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
6a10: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
6a20: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
6a30: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
6a40: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
6a50: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
6a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
6a70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
6a80: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
6a90: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
6aa0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
6ab0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6ac0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
6ad0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
6ae0: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
6af0: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
6b00: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
6b10: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
6b20: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
6b30: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
6b40: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
6b50: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
6b60: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
6b70: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
6b80: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
6b90: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6ba0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
6bb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
6bc0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
6bd0: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
6be0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6c20: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
6c30: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
6c40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6c50: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
6c60: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
6c70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6c80: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
6c90: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
6ca0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
6cb0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
6cc0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
6cd0: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
6ce0: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
6cf0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6d00: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6d10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
6d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6d30: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6d40: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
6d50: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
6d60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6d70: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6d80: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
6d90: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
6da0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6db0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
6dc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
6dd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6de0: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
6df0: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
6e00: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
6e10: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
6e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
6e30: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
6e40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6e50: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
6e60: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
6e70: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
6e80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
6e90: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
6ea0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
6eb0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
6ec0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
6ed0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
6ee0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
6ef0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
6f00: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
6f10: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
6f20: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
6f30: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
6f40: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
6f50: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
6f60: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
6f70: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
6f80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
6f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
6fa0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
6fb0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
6fc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6fd0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
6fe0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
6ff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7000: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
7010: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7020: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
7030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
7040: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
7050: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7060: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
7070: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
7080: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
7090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
70a0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
70b0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
70c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
70d0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
70e0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
70f0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
7100: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
7110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
7120: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
7130: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
7140: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
7150: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
7160: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
7170: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
7180: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
7190: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
71a0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
71b0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
71c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
71d0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
71e0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
71f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
7200: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
7210: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
7220: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
7230: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
7240: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
7250: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7260: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
7270: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
7280: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
7290: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
72a0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
72b0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
72c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
72d0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
72e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
72f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7300: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7310: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7320: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
7330: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
7340: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
7350: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
7360: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
7370: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7380: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
7390: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
73a0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
73b0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
73c0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
73d0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
7400: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
7410: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7440: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
7450: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7460: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
7470: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
7480: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7490: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
74a0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
74b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
74c0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
74d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
74f0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
7500: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
7510: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
7520: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
7530: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
7540: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
7550: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
7560: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
7570: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
7580: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
7590: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
75a0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
75b0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
75c0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
75d0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
75e0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
75f0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
7600: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
7610: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
7620: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7630: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
7640: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7650: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
7660: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
7670: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
7680: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
7690: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
76a0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
76b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
76c0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
76d0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
76e0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
76f0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
7700: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
7710: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
7720: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
7730: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
7740: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
7750: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
7760: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
7770: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
7780: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
7790: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
77a0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
77b0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
77c0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
77d0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
77e0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
77f0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
7800: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
7810: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
7820: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
7830: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
7840: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
7850: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
7860: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
7870: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
7880: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
7890: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
78a0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
78b0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
78c0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
78d0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
78e0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
78f0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
7900: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
7910: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
7920: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
7930: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
7940: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
7950: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
7960: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
7970: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
7980: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
7990: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
79a0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
79b0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
79c0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
79d0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
79e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
79f0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
7a00: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
7a10: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
7a20: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
7a30: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
7a40: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
7a50: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
7a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
7a70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
7a80: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
7a90: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
7aa0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
7ab0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
7ac0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
7ad0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
7ae0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
7af0: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
7b00: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
7b10: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
7b20: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
7b30: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
7b40: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
7b50: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
7b60: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
7b70: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
7b80: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7b90: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7ba0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
7bb0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
7bc0: 0a 20 20 20 20 7a 48 65 61 64 65 72 5b 30 5d 20  .    zHeader[0] 
7bd0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 70 75 74 33  = '\0';.    put3
7be0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7bf0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7c00: 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  gic)], 0);.  }..
7c10: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7c20: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7c30: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7c40: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7c50: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c60: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c70: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c80: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c90: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7ca0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7cb0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7cc0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7cd0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7ce0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7cf0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7d00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7d10: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7d20: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7d30: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7d40: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7d50: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d60: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d70: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d80: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d90: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7da0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7db0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7dc0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7dd0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7de0: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7df0: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7e00: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7e10: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7e20: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7e30: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7e40: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7e50: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e60: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e70: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e80: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e90: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7ea0: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7eb0: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7ec0: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7ed0: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7ee0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7ef0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7f00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7f10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7f20: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7f30: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7f40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7f50: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f60: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f70: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f80: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f90: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7fa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7fb0: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7fc0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7fd0: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7fe0: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7ff0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
8000: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
8010: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
8020: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
8030: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
8040: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8050: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8060: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8070: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8080: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8090: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
80a0: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
80b0: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
80c0: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
80d0: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
80e0: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
80f0: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
8100: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
8110: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
8120: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
8130: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
8140: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
8150: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8160: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8170: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8180: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8190: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
81a0: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
81b0: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
81c0: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
81d0: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
81e0: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
81f0: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
8200: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
8210: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
8220: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
8230: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
8240: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
8250: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8260: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8270: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8280: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8290: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
82a0: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
82b0: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
82c0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
82d0: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
82e0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
82f0: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
8300: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
8310: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
8320: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
8330: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
8340: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
8350: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8360: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8380: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8390: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
83a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
83b0: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
83c0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
83d0: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
83e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
83f0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
8400: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8410: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8420: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8430: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
8440: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
8450: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8460: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8470: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8480: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8490: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
84a0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
84b0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
84c0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
84d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
84e0: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
84f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
8500: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
8510: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
8520: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
8530: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
8540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8550: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8560: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8570: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8580: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8590: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
85a0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
85b0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
85c0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
85d0: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
85e0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
85f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8600: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
8610: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
8620: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
8630: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8640: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
8650: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8660: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8670: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8680: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8690: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
86a0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
86b0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
86c0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
86d0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
86e0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
86f0: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
8700: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
8710: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
8720: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
8730: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
8740: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
8750: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8760: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8770: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8780: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8790: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
87a0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
87b0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
87c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
87d0: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
87e0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
87f0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8800: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
8810: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
8820: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8840: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
8850: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8860: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8870: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8880: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8890: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
88a0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
88b0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
88c0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
88e0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
88f0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8900: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
8910: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
8920: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
8930: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8960: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8970: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8980: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8990: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
89a0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
89b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
89c0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
89d0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
89e0: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
89f0: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
8a00: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
8a10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
8a20: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
8a30: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
8a40: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
8a50: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a60: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a70: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a90: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8aa0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8ab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8ac0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8ad0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8ae0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8af0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8b00: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8b10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8b20: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8b30: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8b40: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8b50: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b60: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b70: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b80: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8ba0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8bb0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8bc0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8bd0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8be0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8bf0: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8c00: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8c10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8c20: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8c30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8c40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8c50: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c60: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c70: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c80: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8ca0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8cb0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8cc0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8cd0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8ce0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8d00: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8d10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8d20: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8d30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8d40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8d50: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d60: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d70: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d90: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8da0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8db0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8dc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8dd0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8de0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8df0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8e00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8e10: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8e20: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8e30: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e60: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e70: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e80: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ea0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8eb0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8ec0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8ed0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8ee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8ef0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8f00: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8f20: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8f30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8f40: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8f50: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f60: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f70: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f80: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f90: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8fa0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8fb0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8fc0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8fd0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8fe0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8ff0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
9000: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
9010: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
9020: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
9030: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9040: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9050: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9060: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9070: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9080: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9090: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
90a0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
90b0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
90c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
90d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
90e0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
90f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
9100: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
9110: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
9120: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
9130: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
9140: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
9150: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9160: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9170: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9180: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9190: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
91a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
91b0: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
91c0: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
91d0: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
91e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
91f0: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9210: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9220: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9230: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9240: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
9250: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9260: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9270: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9280: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9290: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
92a0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
92b0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
92c0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
92d0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
92e0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
92f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9300: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9310: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9320: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9330: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
9340: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
9350: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9360: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9370: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9380: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9390: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
93a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
93b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
93c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
93d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
93e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
93f0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9400: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9410: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9420: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9430: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
9440: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
9450: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9460: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9470: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9480: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9490: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
94a0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
94b0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
94c0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
94d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
94e0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
94f0: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
9500: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
9510: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
9520: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9530: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
9540: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
9550: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
9560: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
9570: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
9580: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
9590: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
95a0: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
95b0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
95c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
95d0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
95e0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
95f0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
9600: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
9610: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
9620: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
9630: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
9640: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
9650: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
9660: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
9670: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
9680: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
9690: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
96a0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
96b0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
96c0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
96d0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
96e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
96f0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
9700: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
9710: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
9720: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
9730: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
9750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9760: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
9770: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
9780: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
9790: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
97a0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
97b0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
97c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
97d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
97e0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
97f0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
9800: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
9810: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
9820: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
9830: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9840: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
9850: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
9860: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
9870: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
9880: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
9890: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
98a0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
98b0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
98c0: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
98d0: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
98e0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
98f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
9900: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
9910: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
9920: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
9930: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
9940: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
9950: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
9960: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
9970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9980: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
9990: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
99a0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
99b0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
99c0: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
99d0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
99e0: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
99f0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
9a00: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
9a10: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
9a20: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
9a30: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
9a40: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
9a50: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
9a60: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9a70: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
9a80: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
9a90: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
9aa0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
9ab0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9ae0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9b10: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
9b20: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
9b30: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9b40: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9b50: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9b70: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
9ba0: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
9bb0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
9bc0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9bd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
9be0: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
9bf0: 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ster */..  if( !
9c00: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
9c10: 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20  r->setMaster.   
9c20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
9c30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c40: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c50: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
9c60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c80: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
9c90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9ca0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
9cb0: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
9cc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9cd0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
9ce0: 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
9cf0: 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
9d00: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
9d10: 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
9d20: 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
9d30: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d40: 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
9d50: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
9d60: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
9d70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
9d80: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
9d90: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9da0: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
9db0: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
9dc0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
9dd0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
9de0: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
9df0: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
9e00: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
9e10: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
9e20: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9e30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
9e40: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
9e50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
9e60: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
9e70: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
9e80: 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
9e90: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
9ea0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
9eb0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
9ec0: 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
9ed0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9ee0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
9ef0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
9f00: 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
9f10: 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
9f20: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
9f30: 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
9f40: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
9f50: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f60: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
9f70: 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
9f80: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
9f90: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9fa0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
9fb0: 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
9fc0: 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
9fd0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9fe0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9ff0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
a000: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
a010: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
a020: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
a030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a040: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
a050: 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
a060: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
a070: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a080: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
a090: 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
a0a0: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
a0b0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a0c0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
a0d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a0e0: 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
a0f0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
a100: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
a110: 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Sync;..  /* If t
a120: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
a130: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
a140: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
a150: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
a160: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
a170: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
a180: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
a190: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
a1a0: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
a1b0: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
a1c0: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
a1d0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
a1e0: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
a1f0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
a200: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
a210: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
a220: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
a230: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
a240: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
a250: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
a260: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
a270: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
a280: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
a290: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
a2a0: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
a2b0: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
a2c0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
a2d0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
a2e0: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
a2f0: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
a300: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
a320: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
a330: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
a340: 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
a350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a360: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
a370: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a380: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
a390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a3a0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
a3b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
a3c0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
a3d0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
a3e0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
a3f0: 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
a400: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
a410: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
a420: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
a430: 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
a440: 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
a450: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
a460: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
a470: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a480: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
a490: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a4b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
a4c0: 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
a4d0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
a4e0: 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
a4f0: 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
a500: 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
a510: 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
a520: 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
a530: 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
a540: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
a550: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
a560: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
a570: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
a580: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
a590: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
a5a0: 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
a5b0: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a5c0: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 61  state, discard a
a5d0: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
a5e0: 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61  es. If.** the pa
a5f0: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a600: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
a610: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
a620: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68  ..**.** TODO: Wh
a630: 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73  y can we not res
a640: 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68 69  et the pager whi
a650: 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  le in error stat
a660: 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e?.*/.static voi
a670: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
a680: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a690: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70  if( SQLITE_OK==p
a6a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
a6b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  {.    sqlite3Bac
a6c0: 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
a6d0: 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  r->pBackup);.   
a6e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
a6f0: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
a700: 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  che);.    pPager
a710: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
a720: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
a730: 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
a740: 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
a750: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
a760: 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
a770: 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
a780: 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
a790: 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
a7a0: 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
a7b0: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
a7c0: 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
a7d0: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
a7e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
a7f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a800: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
a810: 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
a820: 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a840: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
a850: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
a860: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
a870: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
a880: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
a890: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
a8a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
a8b0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
a8c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
a8d0: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
a8e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
a8f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
a900: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
a910: 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
a920: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a930: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
a940: 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
a950: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
a960: 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
a970: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
a980: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
a990: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
a9a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
a9b0: 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
a9c0: 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
a9d0: 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
a9e0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
a9f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
aa00: 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
aa10: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
aa20: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
aa30: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
aa40: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
aa50: 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
aa60: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
aa70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
aa80: 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
aa90: 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
aaa0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
aab0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aad0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
aae0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aaf0: 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
ab00: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
ab10: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ab20: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ab30: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
ab40: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
ab50: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ab60: 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
ab70: 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
ab80: 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
ab90: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
aba0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
abb0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
abc0: 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
abd0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
abe0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
abf0: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
ac00: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
ac10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ac20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
ac30: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ac40: 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
ac50: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
ac60: 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  if the pager.** 
ac70: 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
ac80: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mode..**.** If t
ac90: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
aca0: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
acb0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
acc0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
acd0: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
ace0: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
acf0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
ad00: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
ad10: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
ad20: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
ad30: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
ad40: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
ad50: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
ad60: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
ad70: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
ad80: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
ad90: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
ada0: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
adb0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
adc0: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
add0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
ade0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
adf0: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
ae00: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
ae10: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ae40: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  code */..    /* 
ae50: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
ae60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
ae70: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
ae80: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
ae90: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
aea0: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
aeb0: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
aec0: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
aed0: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
aee0: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
aef0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
af00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
af10: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
af20: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
af30: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
af40: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
af50: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
af60: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
af70: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
af80: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
af90: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
afa0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
afb0: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
afc0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
afd0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
afe0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
aff0: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
b000: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
b010: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
b020: 69 73 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f  is happens. TODO
b030: 3a 20 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64  : Really, this d
b040: 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62  oesn't need to b
b050: 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a  e cleared.    **
b060: 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67   until the chang
b070: 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20  e-counter check 
b080: 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68  fails in PagerSh
b090: 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20  aredLock()..    
b0a0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
b0b0: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
b0c0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f  .    rc = osUnlo
b0d0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
b0e0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
b0f0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61   rc ){.      pPa
b100: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
b110: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  c;.    }.    IOT
b120: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b130: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
b140: 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65     /* If Pager.e
b150: 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
b160: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b170: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
b180: 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20  annot be.    ** 
b190: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
b1a0: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
b1b0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
b1c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b1d0: 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63  e.    ** cache c
b1e0: 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20  an be discarded 
b1f0: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
b200: 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65  de safely cleare
b210: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
b220: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
b230: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  e ){.      if( r
b240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b250: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
b260: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
b270: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b280: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
b290: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
b2a0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
b2b0: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
b2c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
b2d0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
b2e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
b2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
b300: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
b310: 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52  en an IOERR, COR
b320: 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72  RUPT or FULL err
b330: 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f  or.** may have o
b340: 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72  ccurred. The fir
b350: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
b360: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b370: 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74  pager .** struct
b380: 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
b390: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
b3a0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
b3b0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a  ned by a pager .
b3c0: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  ** API function.
b3d0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
b3e0: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
b3f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b400: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73  ment .** to this
b410: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
b420: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
b430: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
b440: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
b450: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
b460: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
b470: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
b480: 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20  rsistent. Until 
b490: 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72  the persisten er
b4a0: 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a  ror is cleared,.
b4b0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50  ** subsequent AP
b4c0: 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20  I calls on this 
b4d0: 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
b4e0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
b4f0: 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72  e same .** error
b500: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70   code..**.** A p
b510: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b520: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
b530: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b540: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
b550: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
b560: 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
b570: 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
b580: 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
b590: 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
b5a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b5b0: 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
b5c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
b5d0: 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
b5e0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
b5f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
b600: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
b610: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
b620: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
b630: 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
b640: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b650: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b660: 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
b670: 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
b680: 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
b690: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
b6a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b6b0: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
b6c0: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
b6d0: 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
b6e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
b6f0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
b700: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b710: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
b720: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
b730: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
b740: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
b750: 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20  R.  );.  if(.   
b760: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
b770: 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  L ||.    rc2==SQ
b780: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
b790: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f    rc2==SQLITE_CO
b7a0: 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70  RRUPT.  ){.    p
b7b0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b7c0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61   rc;.    if( pPa
b7d0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
b7e0: 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26  R_UNLOCK .     &
b7f0: 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
b800: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
b810: 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
b820: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
b830: 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72  the pager is alr
b840: 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63  eady unlocked, c
b850: 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  all pager_unlock
b860: 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20  () now to.      
b870: 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  ** clear the err
b880: 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73  or state and ens
b890: 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
b8a0: 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20  er-cache is .   
b8b0: 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79     ** completely
b8c0: 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f   empty..      */
b8d0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
b8e0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
b8f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b900: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  rc;.}../*.** Exe
b910: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
b920: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
b930: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
b940: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
b950: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
b960: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b970: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
b980: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b990: 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
b9a0: 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
b9b0: 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
b9c0: 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
b9d0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
b9e0: 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
b9f0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
ba00: 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
ba10: 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
ba20: 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
ba30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ba40: 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  le and clear the
ba50: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66   error state. If
ba60: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
ba70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
ba80: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
ba90: 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
baa0: 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e  em, the next con
bab0: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62  nection.** to ob
bac0: 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
bad0: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
bae0: 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
baf0: 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20  is one) will.** 
bb00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
bb10: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
bb20: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
bb30: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
bb40: 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  or state, but an
bb50: 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
bb60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
bb70: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
bb80: 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
bb90: 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
bba0: 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
bbb0: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
bbc0: 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
bbd0: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
bbe0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
bbf0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
bc00: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
bc10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bc20: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
bc30: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
bc40: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
bc50: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bc60: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
bc70: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
bc80: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
bc90: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
bca0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bcb0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
bcc0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
bcd0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
bce0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
bcf0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bd00: 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
bd10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
bd20: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
bd30: 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
bd40: 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
bd50: 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
bd60: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bd70: 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
bd80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
bd90: 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
bda0: 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
bdb0: 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
bdc0: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
bdd0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
bde0: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
bdf0: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
be00: 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
be10: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
be20: 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
be30: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
be40: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
be50: 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
be60: 53 48 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f  SHARED or PAGER_
be70: 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
be80: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
be90: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
bea0: 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75  is a no-op (retu
beb0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  rns SQLITE_OK)..
bec0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
bed0: 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
bee0: 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
bef0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
bf00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bf10: 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
bf20: 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
bf30: 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
bf40: 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
bf50: 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
bf60: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
bf70: 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
bf80: 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
bf90: 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
bfa0: 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
bfb0: 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
bfc0: 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
bfd0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
bfe0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bff0: 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
c000: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
c010: 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
c020: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c030: 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
c040: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
c050: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
c060: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
c070: 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
c080: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
c090: 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
c0a0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
c0b0: 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
c0c0: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
c0d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
c0e0: 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
c0f0: 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
c100: 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
c110: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c120: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
c130: 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
c140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
c150: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
c160: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
c170: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
c180: 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
c190: 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
c1a0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
c1b0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
c1c0: 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
c1d0: 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
c1e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c1f0: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
c200: 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
c210: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
c220: 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
c230: 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
c240: 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
c250: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
c260: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
c270: 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
c280: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c290: 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
c2a0: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
c2b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
c2c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
c2d0: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
c2e0: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
c2f0: 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
c300: 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
c310: 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
c320: 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
c330: 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
c340: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
c350: 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
c360: 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
c370: 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
c380: 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
c390: 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
c3a0: 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
c3b0: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
c3c0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
c3d0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
c3e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
c3f0: 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67  ized, if running
c400: 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
c410: 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70  e mode, the.** p
c420: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
c430: 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
c440: 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73   (and downgrades
c450: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
c460: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c470: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a  e accordingly)..
c480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
c490: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
c4a0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
c4b0: 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f  and is in PAGER_
c4c0: 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a  SYNCED state,.**
c4d0: 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47   it moves to PAG
c4e0: 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f  ER_EXCLUSIVE. No
c4f0: 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67   locks are downg
c500: 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69  raded when runni
c510: 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69  ng in.** exclusi
c520: 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  ve mode..**.** S
c530: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c540: 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
c550: 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
c560: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
c570: 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
c580: 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
c590: 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
c5a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
c5b0: 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
c5c0: 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
c5d0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
c5e0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
c5f0: 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
c600: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
c610: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c620: 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
c630: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
c640: 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
c650: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
c660: 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
c670: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c680: 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
c690: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
c6a0: 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
c6b0: 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
c6c0: 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
c6d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
c6e0: 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
c6f0: 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
c700: 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
c710: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
c720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c730: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c740: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c750: 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
c760: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c770: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
c780: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c790: 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
c7a0: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
c7b0: 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
c7c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
c7d0: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c7e0: 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
c7f0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  peration */..  i
c800: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c810: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
c820: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c830: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
c840: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
c850: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
c860: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
c870: 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
c880: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c890: 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
c8a0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
c8b0: 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44  ) ){..    /* TOD
c8c0: 4f 3a 20 54 68 65 72 65 27 73 20 61 20 70 72 6f  O: There's a pro
c8d0: 62 6c 65 6d 20 68 65 72 65 20 69 66 20 61 20 6a  blem here if a j
c8e0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 77 61 73 20  ournal-file was 
c8f0: 6f 70 65 6e 65 64 20 69 6e 20 4d 45 4d 4f 52 59  opened in MEMORY
c900: 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 61 6e 64  .    ** mode and
c910: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
c920: 6c 2d 6d 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l-mode is change
c930: 64 20 74 6f 20 54 52 55 4e 43 41 54 45 20 6f 72  d to TRUNCATE or
c940: 20 50 45 52 53 49 53 54 0a 20 20 20 20 2a 2a 20   PERSIST.    ** 
c950: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
c960: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 63 6f 64  action. This cod
c970: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  e should be chan
c980: 67 65 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20  ged to assume.  
c990: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6a 6f    ** that the jo
c9a0: 75 72 6e 61 6c 20 6d 6f 64 65 20 68 61 73 20 6e  urnal mode has n
c9b0: 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65  ot changed since
c9c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c9d0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 73 74 61 72   was.    ** star
c9e0: 74 65 64 2e 20 41 6e 64 20 74 68 65 20 73 71 6c  ted. And the sql
c9f0: 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
ca00: 4d 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Mode() function 
ca10: 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a  should be.    **
ca20: 20 63 68 61 6e 67 65 64 20 74 6f 20 6d 61 6b 65   changed to make
ca30: 20 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20   sure that this 
ca40: 69 73 20 74 68 65 20 63 61 73 65 20 74 6f 6f 2e  is the case too.
ca50: 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  .    */..    /* 
ca60: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
ca70: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
ca80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
ca90: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
caa0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
cab0: 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
cac0: 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c   isMemoryJournal
cad0: 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a   = sqlite3IsMemJ
cae0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
caf0: 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fd);.      sqlit
cb00: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
cb10: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
cb20: 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e  ( !isMemoryJourn
cb30: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  al ){.        rc
cb40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
cb50: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
cb60: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
cb70: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
cb80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
cb90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
cba0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
cbb0: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
cbc0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
cbd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
cbe0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
cbf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
cc00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
cc20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
cc30: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
cc40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cc50: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
cc60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cc70: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
cc80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
cc90: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
cca0: 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  ode .     || pPa
ccb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ccc0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ccd0: 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
cce0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
ccf0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
cd00: 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
cd10: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
cd20: 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
cd30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cd40: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
cd50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cd60: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
cd70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cd80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cd90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cda0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cdb0: 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a  DELETE || rc );.
cdc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
cdd0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
cde0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
cdf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
ce00: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
ce10: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ce20: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
ce30: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
ce40: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
ce50: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ce60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ce70: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
ce80: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
ce90: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
cea0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
ceb0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
cec0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c  .#endif..    sql
ced0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
cee0: 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
cef0: 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  he);.    sqlite3
cf00: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
cf10: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
cf20: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
cf30: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
cf40: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
cf50: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
cf60: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
cf70: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
cf80: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
cf90: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
cfa0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
cfb0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
cfc0: 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61  _SHARED;.    pPa
cfd0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
cfe0: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Done = 0;.  }els
cff0: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
d000: 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
d010: 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  D ){.    pPager-
d020: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
d030: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
d040: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
d050: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
d060: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
d070: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
d080: 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ied = 0;..  /* T
d090: 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74  ODO: Is this opt
d0a0: 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65  imal? Why is the
d0b0: 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64   db size invalid
d0c0: 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20  ated here .  ** 
d0d0: 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  when the databas
d0e0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e  e file is not un
d0f0: 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61  locked? */.  pPa
d100: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
d110: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
d120: 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
d130: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
d140: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
d150: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
d160: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
d170: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  eValid = 0;.  }.
d180: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
d190: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
d1a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
d1b0: 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
d1c0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
d1d0: 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
d1e0: 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
d1f0: 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
d200: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
d210: 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
d220: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
d230: 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
d240: 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
d250: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
d260: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
d270: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
d280: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
d290: 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
d2a0: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
d2b0: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
d2c0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
d2d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d2e0: 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
d2f0: 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
d300: 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
d310: 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
d320: 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
d330: 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
d340: 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
d350: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
d360: 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
d370: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
d380: 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
d390: 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
d3a0: 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
d3b0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
d3c0: 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
d3d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
d3e0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
d3f0: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
d400: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
d410: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
d420: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
d430: 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
d440: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
d450: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
d460: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
d470: 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
d480: 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
d490: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
d4a0: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
d4b0: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
d4c0: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
d4d0: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
d4e0: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
d4f0: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
d500: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
d510: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
d520: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
d530: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
d540: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
d550: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
d560: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
d570: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
d580: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
d590: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
d5a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
d5b0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
d5c0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
d5d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
d5e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
d5f0: 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
d600: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d610: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
d620: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
d630: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
d640: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
d650: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
d660: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
d670: 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
d680: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d690: 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
d6a0: 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
d6b0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
d6c0: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
d6d0: 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
d6e0: 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
d6f0: 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
d700: 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
d710: 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
d720: 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
d730: 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
d740: 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
d750: 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
d760: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
d770: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69  .**.** The isMai
d780: 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72  nJrnl flag is tr
d790: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
d7a0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
d7b0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66  journal and.** f
d7c0: 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61  alse for the sta
d7d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
d7e0: 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
d7f0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a  ck journal uses.
d800: 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  ** checksums - t
d810: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d820: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  rnal does not..*
d830: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
d840: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
d850: 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
d860: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
d870: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
d880: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
d890: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
d8a0: 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
d8b0: 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
d8c0: 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
d8d0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
d8e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
d8f0: 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
d900: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
d910: 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
d920: 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
d930: 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
d940: 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
d950: 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
d960: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
d970: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
d980: 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
d990: 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
d9a0: 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
d9b0: 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
d9c0: 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
d9d0: 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
d9e0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
d9f0: 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
da00: 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
da10: 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
da20: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
da30: 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
da40: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
da50: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
da60: 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
da70: 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
da80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
da90: 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
daa0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
dab0: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
dac0: 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
dad0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
dae0: 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
daf0: 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
db00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
db10: 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
db20: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
db30: 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
db40: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
db50: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
db60: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
db70: 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
db80: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
db90: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
dba0: 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
dbb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
dbc0: 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
dbd0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
dbe0: 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
dbf0: 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
dc00: 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
dc10: 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
dc20: 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
dc30: 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
dc40: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
dc50: 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
dc60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
dc70: 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
dc80: 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
dc90: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
dca0: 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
dcb0: 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
dcc0: 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
dcd0: 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
dce0: 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
dcf0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
dd00: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
dd10: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
dd20: 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
dd30: 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
dd40: 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
dd50: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
dd60: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
dd70: 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
dd80: 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
dd90: 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
dda0: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
ddb0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ddc0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
ddd0: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
dde0: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
de00: 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
de10: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
de20: 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de40: 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
de50: 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
de60: 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
de70: 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20  Unsync,         
de80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
de90: 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  if reading from 
dea0: 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f  unsynced main jo
deb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a  urnal */.  i64 *
dec0: 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
ded0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
dee0: 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
def0: 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  playback */.  in
df00: 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20  t isSavepnt,    
df10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
df20: 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
df30: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
df40: 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
df70: 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
df80: 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  d back */.){.  i
df90: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
dfa0: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
dfb0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
dfc0: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
dfd0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
dfe0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
dff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e000: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
e010: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
e020: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
e030: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
e040: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
e050: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
e060: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
e070: 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  u8 *aData;      
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e090: 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
e0a0: 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
e0b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
e0c0: 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
e0d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
e0e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
e0f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
e100: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
e110: 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
e120: 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
e130: 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
e140: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
e150: 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
e160: 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
e170: 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
e180: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
e190: 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
e1a0: 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
e1b0: 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
e1c0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
e1d0: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
e1e0: 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
e1f0: 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
e200: 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
e210: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
e220: 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67  Data = (u8*)pPag
e230: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
e240: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
e250: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
e260: 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
e270: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
e280: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20   allocated */.. 
e290: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
e2a0: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
e2b0: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
e2c0: 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
e2d0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
e2e0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
e2f0: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
e300: 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
e310: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
e320: 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
e330: 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
e340: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
e350: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
e360: 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
e370: 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
e380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
e3a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
e3b0: 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  (jfd, aData, pPa
e3c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
e3d0: 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
e3e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e3f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
e400: 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
e410: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
e420: 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
e430: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
e440: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
e450: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
e460: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
e470: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
e480: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
e490: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
e4a0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
e4b0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
e4c0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
e4d0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
e4e0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
e4f0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
e500: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
e510: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
e520: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
e530: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
e540: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
e550: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
e560: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
e570: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
e580: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
e590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
e5a0: 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
e5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e5c0: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
e5d0: 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
e5e0: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
e5f0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
e600: 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
e610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e620: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
e630: 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
e640: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
e650: 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
e660: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
e670: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e680: 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
e690: 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
e6a0: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
e6b0: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
e6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e6d0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
e6e0: 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   }..  if( pDone 
e6f0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
e700: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
e710: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
e720: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
e730: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
e740: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
e750: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
e760: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
e770: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
e780: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
e790: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
e7a0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
e7b0: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
e7c0: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
e7d0: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
e7e0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e7f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
e800: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
e810: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
e820: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
e830: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
e840: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
e850: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
e860: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
e870: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
e880: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
e890: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
e8a0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
e8b0: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
e8c0: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
e8d0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
e8e0: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
e8f0: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
e900: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
e910: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
e920: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
e930: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
e940: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
e950: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
e960: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
e970: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
e980: 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
e990: 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
e9a0: 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
e9b0: 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
e9c0: 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
e9d0: 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
e9e0: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
e9f0: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
ea00: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
ea10: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
ea20: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
ea30: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
ea40: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
ea50: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
ea60: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
ea70: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
ea80: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
ea90: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
eaa0: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
eab0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
eac0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
ead0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
eae0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
eaf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
eb00: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
eb10: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
eb20: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
eb30: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
eb40: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
eb50: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
eb60: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
eb70: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
eb80: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
eb90: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
eba0: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
ebb0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
ebc0: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
ebd0: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
ebe0: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
ebf0: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
ec00: 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
ec10: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
ec20: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
ec30: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
ec40: 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
ec50: 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
ec60: 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
ec70: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
ec80: 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
ec90: 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
eca0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
ecb0: 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
ecc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
ecd0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
ece0: 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
ecf0: 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
ed00: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
ed10: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
ed20: 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
ed30: 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
ed40: 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
ed50: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
ed60: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
ed70: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
ed80: 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
ed90: 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
eda0: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
edb0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
edc0: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
edd0: 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
ede0: 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
edf0: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
ee00: 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
ee10: 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
ee20: 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
ee30: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
ee40: 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
ee50: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
ee60: 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
ee70: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
ee80: 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
ee90: 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
eea0: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
eeb0: 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
eec0: 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
eed0: 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
eee0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
eef0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
ef00: 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
ef10: 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  Pg || !MEMDB );.
ef20: 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
ef30: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
ef40: 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
ef50: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
ef60: 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
ef70: 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
ef80: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
ef90: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74  ->pageSize, aDat
efa0: 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a),.            
efb0: 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
efc0: 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
efd0: 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
efe0: 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
eff0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
f000: 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20  XCLUSIVE).   && 
f010: 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
f020: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
f030: 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26  NEED_SYNC)).   &
f040: 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
f050: 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e  >fd).   && !isUn
f060: 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36  sync.  ){.    i6
f070: 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
f080: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
f090: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
f0a0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
f0b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
f0c0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f0d0: 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
f0e0: 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
f0f0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
f100: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
f110: 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
f120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f130: 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
f140: 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
f150: 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
f160: 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
f170: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
f180: 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
f190: 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
f1a0: 75 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  up, pgno, aData)
f1b0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
f1c0: 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
f1d0: 6e 6f 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54 45  no, 0, rc=SQLITE
f1e0: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a 20  _NOMEM);.    }. 
f1f0: 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
f200: 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
f210: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
f220: 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
f230: 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
f240: 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
f250: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
f260: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
f270: 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
f280: 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
f290: 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
f2a0: 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
f2b0: 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
f2c0: 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
f2d0: 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
f2e0: 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
f2f0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
f300: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
f310: 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
f320: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
f330: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
f340: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f350: 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
f360: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
f370: 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
f380: 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
f390: 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
f3a0: 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
f3b0: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
f3c0: 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
f3d0: 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
f3e0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
f3f0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
f400: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
f410: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
f420: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
f430: 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
f440: 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
f450: 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
f460: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
f470: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
f480: 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
f490: 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
f4a0: 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
f4b0: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
f4c0: 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
f4d0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
f4e0: 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
f4f0: 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
f500: 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
f510: 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
f520: 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
f530: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
f540: 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
f550: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
f560: 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
f570: 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
f580: 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
f590: 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20  epnt );.    if( 
f5a0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
f5b0: 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
f5c0: 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
f5d0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
f5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f5f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
f600: 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
f610: 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
f620: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
f630: 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
f640: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
f650: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
f660: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
f670: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
f680: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
f690: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
f6a0: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
f6b0: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
f6c0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
f6d0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
f6e0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
f6f0: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
f700: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
f710: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
f720: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
f730: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
f740: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
f750: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
f760: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
f770: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
f780: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
f790: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
f7a0: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
f7b0: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
f7c0: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
f7d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f7e0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
f7f0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
f800: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f810: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
f820: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
f830: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
f840: 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
f850: 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
f860: 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
f870: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
f880: 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
f890: 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
f8a0: 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
f8b0: 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
f8c0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
f8d0: 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
f8e0: 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
f8f0: 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
f900: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
f910: 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
f920: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
f930: 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
f940: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
f950: 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
f960: 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
f970: 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
f980: 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20 20  ut to the..     
f990: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
f9a0: 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
f9b0: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
f9c0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
f9d0: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
f9e0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
f9f0: 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
fa00: 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
fa10: 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
fa20: 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
fa30: 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
fa40: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
fa50: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
fa60: 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
fa70: 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
fa80: 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
fa90: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
faa0: 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
fab0: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
fac0: 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
fad0: 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
fae0: 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
faf0: 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
fb00: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
fb10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
fb20: 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
fb30: 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
fb40: 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
fb50: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
fb60: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
fb70: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
fb80: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
fb90: 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
fba0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
fbb0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
fbc0: 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
fbd0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
fbe0: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
fbf0: 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
fc00: 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
fc10: 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
fc20: 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
fc30: 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
fc40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
fc50: 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
fc60: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
fc70: 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
fc80: 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
fc90: 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
fca0: 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
fcb0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
fcc0: 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
fcd0: 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
fce0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
fcf0: 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
fd00: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
fd10: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
fd20: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
fd30: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
fd40: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
fd50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
fd60: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
fd70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
fd80: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
fd90: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
fda0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
fdb0: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
fdc0: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
fdd0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
fde0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
fdf0: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
fe00: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
fe10: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
fe20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
fe30: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
fe40: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
fe50: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
fe60: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
fe70: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
fe80: 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
fe90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
fea0: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
feb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fec0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
fed0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
fee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
fef0: 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
ff00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
ff10: 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74  oks ahead into t
ff20: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ff30: 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69  file and determi
ff40: 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
ff50: 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72  r not the next r
ff60: 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72  ecord (the recor
ff70: 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74  d that begins at
ff80: 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20   file.** offset 
ff90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ffa0: 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f  ff) is a well-fo
ffb0: 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72 64  rmed page record
ffc0: 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f   consisting.** o
ffd0: 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e  f a valid page n
ffe0: 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61  umber, pPage->pa
fff0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
10000 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65  content, followe
10010 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20  d.** by a valid 
10020 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  checksum..**.** 
10030 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72 20  The pager never 
10040 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68  needs to know th
10050 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  is in order to d
10060 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69  o its job.   Thi
10070 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
10080 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77  only used from w
10090 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
100a0 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
100b0 63 72 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cros..*/.static 
100c0 69 6e 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75  int pagerNextJou
100d0 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
100e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
100f0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
10100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10110 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
10120 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63   page */.  u32 c
10130 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
10140 2f 2a 20 54 68 65 20 70 61 67 65 20 63 68 65 63  /* The page chec
10150 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ksum */.  int rc
10160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10170 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
10180 6f 6d 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  om read operatio
10190 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ns */.  sqlite3_
101a0 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20  file *fd;    /* 
101b0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
101c0 74 6f 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77  tor from which w
101d0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f  e are reading */
101e0 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20  .  u8 *aData;   
101f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
10200 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
10210 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
10220 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61   page number hea
10230 64 65 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50  der */.  fd = pP
10240 61 67 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20  ager->jfd;.  rc 
10250 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 64 2c  = read32bits(fd,
10260 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10270 4f 66 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  Off, &pgno);.  i
10280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10290 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69   /*NO_TEST*/.  i
102d0 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
102e0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
102f0 4f 28 70 50 61 67 65 72 29 20 29 7b 20 72 65 74  O(pPager) ){ ret
10300 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
10310 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69   /*NO_TEST*/.  i
10320 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
10330 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20  ager->dbSize ){ 
10340 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20   /*NO_TEST*/..  
10370 2f 2a 20 52 65 61 64 20 74 68 65 20 63 68 65 63  /* Read the chec
10380 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72  ksum */.  rc = r
10390 65 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50  ead32bits(fd, pP
103a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
103b0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
103c0 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  e+4, &cksum);.  
103d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
103e0 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  K ){ return 0; }
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20    /*NO_TEST*/.. 
10420 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
10430 61 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65  a and verify the
10440 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61   checksum */.  a
10450 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67  Data = (u8*)pPag
10460 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
10470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
10480 65 61 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70  ead(fd, aData, p
10490 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
104a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
104b0 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  Off+4);.  if( rc
104c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72  !=SQLITE_OK ){ r
104d0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
10500 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61  _TEST*/.  if( pa
10510 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
10520 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
10530 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
10540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
10550 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65  _TEST*/..  /* Re
10560 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f  ach this point o
10570 6e 6c 79 20 69 66 20 74 68 65 20 70 61 67 65 20  nly if the page 
10580 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65  is valid */.  re
10590 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
105a0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45   /* !defined(NDE
105b0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
105c0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
105d0 54 45 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TEST) */../*.** 
105e0 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
105f0 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
10600 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10610 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
10620 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
10630 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
10640 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
10650 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
10660 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
10670 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
10680 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
10690 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
106a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
106b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
106c0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
106d0 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
106e0 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
106f0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
10700 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
10710 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
10720 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
10730 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
10740 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
10750 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
10760 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10770 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
10780 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
10790 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
107a0 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
107b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
107c0 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
107d0 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
107e0 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
107f0 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
10800 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
10810 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
10820 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
10830 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
10840 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
10850 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10860 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
10870 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
10880 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
10890 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
108a0 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
108b0 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
108c0 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
108d0 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
108e0 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
108f0 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
10900 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10910 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
10920 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
10930 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
10940 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
10950 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
10960 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10970 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
10980 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
10990 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
109a0 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
109b0 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
109c0 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
109d0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
109e0 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
109f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
10a00 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
10a10 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
10a20 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
10a30 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
10a40 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
10a50 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
10a60 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
10a70 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
10a80 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
10a90 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
10aa0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
10ab0 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
10ac0 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
10ad0 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
10ae0 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
10af0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
10b00 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
10b10 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
10b20 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
10b30 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
10b40 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
10b50 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
10b60 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
10b70 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
10b80 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10b90 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
10ba0 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
10bb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
10bc0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10bd0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
10be0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
10bf0 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
10c00 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
10c10 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
10c20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
10c30 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
10c40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
10c50 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
10c60 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
10c70 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
10c80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10c90 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
10ca0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
10cb0 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
10cc0 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
10cd0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
10ce0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10cf0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
10d00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
10d10 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
10d20 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
10d30 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
10d40 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
10d50 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
10d60 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
10d70 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
10d80 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
10d90 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
10da0 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
10db0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
10dc0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
10dd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10de0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10df0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
10e00 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
10e10 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
10e20 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
10e30 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10e40 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
10e50 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
10e60 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
10e70 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
10e80 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
10e90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
10ea0 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
10eb0 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
10ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
10ed0 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
10ee0 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
10ef0 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
10f00 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
10f10 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
10f20 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ce for both the 
10f30 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61  pJournal and pMa
10f40 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ster file descri
10f50 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73  ptors..  ** If s
10f60 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20  uccessful, open 
10f70 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10f80 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  al file for read
10f90 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73  ing..  */.  pMas
10fa0 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  ter = (sqlite3_f
10fb0 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ile *)sqlite3Mal
10fc0 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a  locZero(pVfs->sz
10fd0 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
10fe0 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
10ff0 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
11000 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
11010 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
11020 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
11030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11040 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
11050 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
11060 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
11070 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
11080 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
11090 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
110a0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
110b0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
110c0 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
110d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
110e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
110f0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11100 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11110 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
11120 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
11130 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
11140 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11150 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11160 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
11170 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
11180 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
11190 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
111a0 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Ptr = 0;.    int
111b0 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
111c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
111d0 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
111e0 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
111f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
11200 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
11210 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
11220 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
11230 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
11240 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
11250 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
11260 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
11270 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  har *)sqlite3Mal
11280 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
11290 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
112a0 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
112b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
112c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
112d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
112e0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
112f0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
11300 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
11310 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
11320 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
11330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
11340 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
11350 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
11360 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
11370 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
11380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11390 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
113a0 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
113b0 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
113c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
113d0 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
113e0 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
113f0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
11400 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20  nt exists;.     
11410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
11420 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
11430 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
11440 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
11450 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sts);.      if( 
11460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11470 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
11480 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
11490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
114a0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
114b0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
114c0 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
114d0 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
114e0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
114f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
11500 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
11510 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
11520 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11530 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
11540 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
11550 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
11560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11570 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
11580 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
11590 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
115a0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
115b0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
115c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
115d0 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  L);.        rc =
115e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
115f0 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
11600 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
11610 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11630 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11640 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11650 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11660 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
11670 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
11680 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
11690 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
116a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
116b0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
116c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
116d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
116e0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
116f0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
11700 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
11710 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
11720 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
11730 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
11740 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
11750 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
11760 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
11770 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
11780 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11790 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
117a0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
117b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
117c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
117d0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
117e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
117f0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
11800 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
11810 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
11820 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11830 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
11840 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
11850 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
11860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
11870 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
11880 20 7d 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74   }  .  if( pMast
11890 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
118a0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
118b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
118c0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
118d0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
118e0 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
118f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11900 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11910 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
11920 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
11930 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
11940 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
11950 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11960 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
11970 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
11980 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
11990 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
119a0 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
119b0 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
119c0 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
119d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
119e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
119f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11a00 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61  s not open, or a
11a10 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11a20 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c   is not.** held,
11a30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11a40 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
11a50 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f  wise, the size o
11a60 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a  f the file is.**
11a70 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
11a80 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
11a90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11aa0 62 79 74 65 73 29 2e 20 49 66 20 74 68 65 20 66  bytes). If the f
11ab0 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69  ile.** on disk i
11ac0 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
11ad0 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
11ae0 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
11af0 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
11b00 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
11b10 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
11b20 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
11b30 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
11b40 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
11b50 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
11b60 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
11b70 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
11b80 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
11b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
11ba0 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
11bb0 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
11bc0 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
11bd0 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
11be0 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
11bf0 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
11c00 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
11c10 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
11c20 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
11c30 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
11c40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
11c50 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
11c60 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
11c70 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
11c80 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
11c90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
11ca0 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
11cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11cc0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
11cd0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
11ce0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
11cf0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
11d00 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
11d10 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
11d20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11d30 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
11d40 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
11d50 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 69  R_EXCLUSIVE && i
11d60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
11d70 29 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72  ) ){.    i64 cur
11d80 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
11d90 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  e;.    /* TODO: 
11da0 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
11db0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
11dc0 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
11dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11de0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
11df0 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
11e00 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
11e10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11e20 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
11e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11e40 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
11e50 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
11e60 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
11e70 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
11e80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11e90 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
11ea0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
11eb0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
11ec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11ed0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
11ee0 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
11ef0 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
11f00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
11f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11f20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
11f30 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
11f40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
11f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11f70 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11f80 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
11f90 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
11fa0 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
11fb0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
11fc0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11fd0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
11fe0 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
11ff0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
12000 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
12010 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
12020 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
12030 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
12040 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
12050 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
12060 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
12070 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
12080 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
12090 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
120a0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
120b0 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
120c0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
120d0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
120e0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
120f0 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
12100 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
12110 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
12120 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
12130 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
12140 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
12150 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
12160 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 35   rounded up to 5
12170 31 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  12 if.** it is l
12180 65 73 73 20 74 68 61 6e 20 35 31 32 2c 20 6f 72  ess than 512, or
12190 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
121a0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
121b0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
121c0 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
121d0 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74  CTOR_SIZE..*/.st
121e0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
121f0 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
12200 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
12210 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
12220 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
12230 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
12240 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
12250 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
12260 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
12270 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
12280 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
12290 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
122a0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
122b0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
122c0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
122d0 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
122e0 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
122f0 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
12300 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
12310 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
12320 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
12330 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
12340 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
12350 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32  ->sectorSize<512
12360 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12370 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
12380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
12390 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d  er->sectorSize>M
123a0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
123b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
123c0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
123d0 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  12 );.    pPager
123e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d  ->sectorSize = M
123f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
12400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
12410 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
12420 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
12430 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
12440 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
12450 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
12460 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
12470 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
12480 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
12490 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
124a0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
124b0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
124c0 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
124d0 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
124e0 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
124f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12500 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12510 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12520 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
12530 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
12540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
12550 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
12560 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
12570 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
12580 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
12590 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
125a0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
125b0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
125c0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
125d0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
125e0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
125f0 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
12600 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
12610 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
12620 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
12630 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
12640 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
12650 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
12660 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
12670 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
12680 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
12690 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
126a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
126b0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
126c0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
126d0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
126e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
126f0 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
12700 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12710 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12720 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28  page case..**  (
12730 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  7)  4 byte integ
12740 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12750 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12760 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
12770 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
12780 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
12790 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
127a0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
127b0 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
127c0 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
127d0 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65  .**  (8)  N byte
127e0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
127f0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
12800 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
12810 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
12820 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
12830 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
12840 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
12850 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
12860 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
12870 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
12880 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
12890 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
128a0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
128b0 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
128c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
128d0 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
128e0 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20  ..**  (9)  Zero 
128f0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
12900 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
12910 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
12920 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
12930 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
12940 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
12950 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
12960 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
12970 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
12980 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
12990 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
129a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
129b0 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
129c0 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 8 items above.
129d0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
129e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
129f0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
12a00 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 9th item..**
12a10 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
12a20 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
12a30 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
12a40 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
12a50 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
12a60 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
12a70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
12a80 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
12a90 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
12aa0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
12ab0 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
12ac0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12ad0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
12ae0 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
12af0 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
12b00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
12b10 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
12b20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
12b30 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
12b40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12b50 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
12b60 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
12b70 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
12b80 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
12b90 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
12ba0 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
12bb0 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
12bc0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
12bd0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
12be0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
12bf0 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
12c00 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
12c10 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
12c20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
12c30 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
12c40 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
12c50 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
12c60 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
12c70 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
12c80 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
12c90 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
12ca0 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
12cb0 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
12cc0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
12cd0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
12ce0 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
12cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
12d00 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
12d10 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
12d20 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
12d30 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
12d40 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
12d50 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
12d60 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
12d70 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
12d80 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
12d90 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
12da0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
12db0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
12dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12dd0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
12de0 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
12df0 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
12e00 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
12e10 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
12e20 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
12e30 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
12e40 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
12e50 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
12e60 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
12e70 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
12e80 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
12e90 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
12ea0 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
12eb0 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
12ec0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
12ed0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
12ee0 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
12ef0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
12f00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
12f10 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
12f20 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
12f30 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
12f40 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
12f50 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
12f60 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
12f70 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
12f80 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
12f90 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
12fa0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
12fb0 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
12fc0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
12fd0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
12fe0 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
12ff0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
13000 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
13010 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
13020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
13030 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
13040 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
13050 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
13060 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
13070 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
13080 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
13090 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
130a0 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
130b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
130c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
130d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
130e0 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
130f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
13100 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
13110 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
13120 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13130 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13140 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
13150 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
13160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13170 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
13180 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
13190 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131b0 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
131c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
131d0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
131e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
131f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
13200 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
13210 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
13230 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
13240 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13250 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
13260 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
13270 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
13280 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
13290 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
132a0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
132b0 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
132c0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
132d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
132e0 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
132f0 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
13300 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
13310 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
13320 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
13330 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
13340 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
13350 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
13360 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
13370 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
13380 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
13390 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
133a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
133c0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
133d0 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
133e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
133f0 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
13400 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
13410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
13420 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13430 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
13440 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
13450 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
13460 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
13470 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
13480 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
13490 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
134a0 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
134b0 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
134c0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
134d0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
134e0 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
134f0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
13500 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
13510 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
13520 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
13530 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
13540 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
13550 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
13560 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
13570 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
13580 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
13590 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
135a0 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
135b0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
135c0 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
135d0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
135e0 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
135f0 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
13600 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
13610 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
13620 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
13630 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
13640 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
13650 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
13660 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
13670 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
13680 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
13690 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
136a0 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
136b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
136c0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
136d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
136e0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
136f0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
13700 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
13710 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
13720 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
13730 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
13740 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
13750 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
13760 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13770 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
13780 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
13790 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
137a0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
137b0 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
137c0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
137d0 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
137e0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
137f0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
13800 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
13810 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
13820 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
13830 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
13840 6e 74 20 69 73 55 6e 73 79 6e 63 20 3d 20 30 3b  nt isUnsync = 0;
13850 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
13860 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
13870 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
13880 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
13890 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
138a0 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
138b0 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
138c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
138d0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
138e0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
138f0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
13900 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
13910 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
13920 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
13930 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
13940 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
13950 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
13960 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
13970 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
13980 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
13990 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
139a0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
139b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
139c0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
139d0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
139e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
139f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13a00 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
13a10 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13a20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
13a30 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
13a40 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
13a50 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
13a60 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
13a70 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
13a80 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
13a90 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13aa0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
13ab0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
13ac0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
13ad0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
13ae0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
13af0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
13b00 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
13b10 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
13b20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
13b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13b40 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
13b50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13b60 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13b70 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
13b80 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
13b90 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
13ba0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
13bb0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13bc0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
13bd0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
13be0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
13bf0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
13c00 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
13c10 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
13c20 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
13c30 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
13c40 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
13c50 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
13c60 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
13c70 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
13c80 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
13c90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13ca0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
13cb0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
13cc0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
13cd0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
13ce0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
13cf0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
13d00 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
13d10 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
13d20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
13d30 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
13d40 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
13d50 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
13d60 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
13d70 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
13d80 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
13d90 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
13da0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
13db0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
13dc0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
13dd0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
13de0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
13df0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
13e00 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
13e10 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
13e20 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
13e30 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
13e40 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
13e50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
13e60 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13e70 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
13e80 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
13e90 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
13ea0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
13eb0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
13ec0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
13ed0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
13ee0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
13ef0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
13f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
13f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73  ..    */.    tes
13f20 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20 26  tcase( nRec==0 &
13f30 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20 20  & !isHot.       
13f40 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
13f50 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
13f60 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
13f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13f80 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
13f90 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
13fa0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
13fb0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
13fc0 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
13fd0 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
13fe0 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
13ff0 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 20  ager).    );.   
14000 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
14010 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
14020 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14030 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
14040 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
14050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14060 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
14070 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
14080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
14090 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
140a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
140b0 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
140c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
140d0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
140e0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
140f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
14100 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
14110 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
14120 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
14130 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
14140 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
14150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14160 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
14170 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
14180 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
14190 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
141a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
141b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
141c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
141d0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
141e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
141f0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
14200 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
14210 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
14220 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
14230 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
14240 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
14250 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
14260 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
14270 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
14280 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
14290 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
142a0 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
142b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
142c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
142d0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
142e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
142f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
14300 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
14310 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
14320 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
14330 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
14340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
14360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
14370 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
14380 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14390 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
143a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
143b0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
143c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
143d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
143e0 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
143f0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
14400 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
14410 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
14420 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
14430 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
14440 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
14450 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
14460 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
14470 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
14480 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
14490 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
144a0 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
144b0 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
144c0 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
144d0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
144e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
144f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14500 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
14510 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
14520 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14530 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
14540 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
14550 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
14560 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
14570 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14590 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
145a0 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
145b0 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
145c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
145d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
145e0 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
145f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
14600 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
14610 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
14620 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
14630 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
14640 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
14650 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
14660 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
14670 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70  .  assert(.    p
14680 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
14690 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71  ods==0 ||.    sq
146a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
146b0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  ol(pPager->fd,SQ
146c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
146d0 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49  CHANGED,0)>=SQLI
146e0 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a  TE_OK.  );..  /*
146f0 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
14700 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
14710 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
14720 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
14730 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
14740 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
14750 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
14760 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
14770 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
14780 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
14790 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
147a0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
147b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
147c0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
147d0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
147e0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
147f0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
14800 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
14810 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
14820 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
14830 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
14840 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
14850 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
14860 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
14870 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
14880 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
14890 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
148a0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
148b0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
148c0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
148d0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
148e0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
148f0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
14900 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
14910 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
14920 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
14930 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
14940 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14950 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
14960 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
14970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14980 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
14990 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
149a0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
149b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
149c0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
149d0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
149e0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
149f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14a10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
14a30 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
14a40 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14a50 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
14a60 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
14a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
14a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
14aa0 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
14ab0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
14ac0 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
14ad0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
14ae0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
14af0 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
14b00 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
14b10 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
14b20 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
14b30 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
14b40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
14b50 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
14b60 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
14b70 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14b80 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
14b90 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
14ba0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
14bb0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
14bc0 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
14bd0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
14be0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
14bf0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
14c00 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
14c10 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
14c20 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
14c30 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
14c40 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
14c50 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
14c60 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14c70 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
14c80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
14c90 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
14ca0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
14cb0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
14cc0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
14cd0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
14ce0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14cf0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
14d00 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
14d10 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
14d20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
14d30 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
14d40 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
14d50 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
14d60 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
14d70 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
14d80 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
14d90 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
14da0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
14db0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
14dc0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
14dd0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
14de0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
14df0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
14e00 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
14e10 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
14e20 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
14e30 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
14e40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
14e50 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
14e60 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
14e70 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
14e80 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
14e90 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
14ea0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
14eb0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14ec0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
14ed0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14ee0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
14ef0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
14f00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14f10 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
14f20 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
14f30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14f40 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
14f50 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
14f60 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
14f70 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
14f80 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14f90 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
14fa0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
14fb0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
14fc0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14fd0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14fe0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14ff0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
15000 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
15010 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
15020 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15030 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
15040 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
15050 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
15060 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
15070 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
15080 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
15090 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
150a0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
150b0 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
150c0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
150d0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
150e0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
150f0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
15100 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
15110 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
15120 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
15130 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
15140 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
15150 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
15160 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
15170 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
15180 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
15190 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
151a0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
151b0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
151c0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
151d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
151e0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
151f0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
15200 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
15210 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
15220 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
15230 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
15240 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
15250 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
15260 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
15270 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
15280 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
15290 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
152a0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
152b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
152c0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
152d0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
152e0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
152f0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
15300 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
15310 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
15320 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
15330 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
15340 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
15350 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
15360 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
15370 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
15380 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
15390 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
153a0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
153b0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
153c0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
153d0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
153e0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
153f0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
15400 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
15410 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
15420 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
15430 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
15440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
15450 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15460 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
15470 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
15480 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
15490 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
154a0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
154b0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
154c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
154d0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
154e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
154f0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
15500 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
15510 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
15520 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
15530 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
15540 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
15550 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
15560 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
15570 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
15580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15590 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
155a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
155b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
155c0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
155d0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
155e0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
155f0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
15600 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
15610 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
15620 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
15630 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
15640 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
15650 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20  ->dbOrigSize;.. 
15660 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
15670 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
15680 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
15690 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
156a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
156b0 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
156c0 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
156d0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
156e0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
156f0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
15700 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
15710 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
15720 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
15730 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
15740 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
15750 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
15760 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
15770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
15780 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
15790 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
157a0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
157b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
157c0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
157d0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
157e0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
157f0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
15800 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
15810 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
15820 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
15830 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
15840 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
15850 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
15860 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15870 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
15880 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
15890 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
158a0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
158b0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
158c0 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
158d0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
158e0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
158f0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
15900 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
15910 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
15920 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
15930 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
15940 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
15950 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
15960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15970 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
15980 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
15990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
159a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
159b0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
159c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
159d0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
159e0 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20  e(pPager, 1, 0, 
159f0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
15a00 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  Off, 1, pDone);.
15a10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
15a30 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
15a40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a50 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
15a60 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
15a70 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
15a80 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
15a90 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
15aa0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
15ab0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
15ac0 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
15ad0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
15ae0 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
15af0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
15b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
15b10 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
15b20 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
15b30 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
15b40 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
15b50 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
15b60 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
15b70 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
15b80 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
15b90 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
15ba0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
15bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15bc0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15bd0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
15be0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15bf0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
15c00 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
15c10 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
15c20 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
15c30 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
15c40 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
15c50 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15c60 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
15c70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
15c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15c90 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
15ca0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
15cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
15cc0 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
15cd0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
15ce0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
15cf0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
15d00 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
15d10 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
15d20 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
15d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
15d40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15d50 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20  !(nJRec==0.     
15d60 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
15d70 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
15d80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15d90 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
15da0 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26  lOff.         &&
15db0 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d   ((szJ - pPager-
15dc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
15dd0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
15de0 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20  ger))>0.        
15df0 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75   && pagerNextJou
15e00 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
15e10 70 50 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a  pPager)).    );.
15e20 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
15e30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
15e40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15e50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15e60 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15e70 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
15e80 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
15e90 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
15ea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
15eb0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
15ec0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
15ed0 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
15ee0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
15ef0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
15f00 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
15f10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
15f20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15f30 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15f40 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e   1, 0, &pPager->
15f50 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70  journalOff, 1, p
15f60 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15f70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15f80 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15f90 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15fa0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
15fb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73  r->journalOff==s
15fc0 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
15fd0 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
15fe0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
15ff0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
16000 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
16010 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
16020 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
16030 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
16040 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
16050 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
16060 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
16070 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
16080 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
16090 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
160a0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
160b0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
160c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
160d0 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
160e0 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69  ffset = pSavepoi
160f0 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
16100 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16110 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  ;.    for(ii=pSa
16120 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
16130 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
16140 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
16150 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
16160 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
16170 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72  et==ii*(4+pPager
16180 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
16190 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
161a0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
161b0 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20  e(pPager, 0, 0, 
161c0 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e  &offset, 1, pDon
161d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
161e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
161f0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
16200 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
16210 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
16220 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16230 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
16240 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
16250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16260 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
16270 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
16280 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
16290 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
162a0 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
162b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
162c0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
162d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
162e0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
162f0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
16300 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
16310 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
16320 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
16330 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
16340 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
16350 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
16360 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
16370 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
16380 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
16390 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
163a0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
163b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
163c0 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
163d0 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
163e0 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
163f0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
16400 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
16410 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
16420 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
16430 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
16440 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
16450 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
16460 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
16470 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
16480 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
16490 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
164a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
164b0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
164c0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
164d0 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
164e0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
164f0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
16500 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
16510 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
16520 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
16540 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
16550 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
16560 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
16570 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
16580 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
16590 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
165a0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
165b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
165c0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
165d0 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
165e0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
165f0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
16600 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
16610 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
16620 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
16640 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
16650 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
16660 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
16670 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
16680 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
16690 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
166a0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
166b0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
166c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
166d0 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
166e0 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
166f0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
16700 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
16710 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
16720 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
16730 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
16750 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
16760 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
16770 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
16780 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16790 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
167a0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
167b0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
167c0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
167d0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
167e0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
167f0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
16800 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
16810 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
16820 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
16830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
16840 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
16850 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
16860 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
16870 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
16880 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
16890 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
168a0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
168b0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
168c0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
168d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
168e0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
168f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
16900 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
16910 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
16920 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
16930 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
16940 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
16950 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16960 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
16970 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
16980 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16990 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
169a0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
169b0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
169c0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
169d0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
169e0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
169f0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
16a00 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
16a10 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
16a20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
16a30 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
16a40 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
16a50 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
16a60 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
16a70 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
16a80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
16a90 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
16aa0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16ab0 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
16ac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16ad0 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
16ae0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
16af0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
16b00 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
16b10 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
16b20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
16b30 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
16b40 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
16b50 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
16b60 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
16b70 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
16b80 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
16b90 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
16ba0 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
16bb0 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
16bc0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16bd0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
16be0 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
16bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16c00 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
16c10 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
16c20 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
16c30 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
16c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16c50 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
16c60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
16c70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16c80 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
16c90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
16ca0 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
16cb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16cc0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
16cd0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
16ce0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
16cf0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
16d00 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
16d10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16d20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16d30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16d40 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
16d50 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
16d60 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
16d70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
16d80 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
16d90 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
16da0 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
16db0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16dc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16dd0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
16de0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
16df0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
16e00 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
16e10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16e20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
16e30 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
16e40 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
16e50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16e60 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
16e70 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
16e80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
16e90 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
16ea0 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
16eb0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
16ec0 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
16ed0 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
16ee0 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
16ef0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
16f00 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
16f10 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
16f20 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
16f30 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
16f40 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16f50 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
16f60 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
16f70 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
16f80 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
16f90 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
16fa0 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
16fb0 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
16fc0 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
16fd0 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
16fe0 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
16ff0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
17000 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
17010 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
17020 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
17030 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
17040 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
17070 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170b0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
170c0 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
170d0 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
170e0 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
170f0 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
17100 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
17110 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
17120 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
17130 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
17140 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
17150 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
17160 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
17170 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
17180 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
17190 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
171a0 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
171b0 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
171c0 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
171d0 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
171e0 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
171f0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
17200 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
17210 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
17220 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
17230 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
17240 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
17250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17260 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
17270 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
17280 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
17290 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
172a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
172b0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
172c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
172d0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
17300 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
17310 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50  ler */.){  .  pP
17320 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
17330 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
17340 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
17350 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
17360 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
17370 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
17380 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
17390 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
173a0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
173b0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
173c0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
173d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
173e0 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
173f0 73 20 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74  s modified (rest
17400 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74  ored).** as part
17410 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
17420 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  n or savepoint r
17430 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c  ollback. The cal
17440 6c 62 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20  lback gives .** 
17450 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
17460 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  e an opportunity
17470 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
17480 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
17490 20 0a 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20   .** agree with 
174a0 74 68 65 20 72 65 73 74 6f 72 65 64 20 70 61 67  the restored pag
174b0 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
174c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
174d0 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
174e0 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
174f0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29  einit)(DbPage*))
17500 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
17510 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
17520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
17530 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
17540 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
17550 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
17560 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
17570 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
17580 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
17590 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
175a0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
175b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
175c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
175d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
175e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
175f0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
17600 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
17610 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
17640 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
17650 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
17660 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
17670 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
17680 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
17690 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
176a0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
176b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
176c0 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
176d0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
176e0 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
176f0 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
17700 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
17710 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
17720 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
17730 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
17740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17750 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
17760 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
17770 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
17780 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
17790 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
177a0 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
177b0 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
177c0 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c  E_CORRUPT or SQL
177d0 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
177e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
177f0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
17800 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
17810 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
17820 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
17830 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
17840 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
17850 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
17860 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
17870 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
17880 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
17890 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
178a0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
178b0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
178c0 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
178d0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
178e0 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
178f0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
17900 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
17910 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
17920 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
17930 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
17940 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
17950 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
17960 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
17970 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
17980 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
17990 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
179a0 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
179b0 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
179c0 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
179d0 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
179e0 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
179f0 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
17a00 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
17a10 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
17a20 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
17a30 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
17a40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
17a50 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
17a60 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
17a70 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
17a80 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
17a90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17aa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
17ab0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
17ac0 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
17ad0 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
17ae0 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
17af0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
17b00 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
17b10 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
17b20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
17b30 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
17b40 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
17b50 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
17b60 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
17b70 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
17b80 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
17b90 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
17ba0 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
17bb0 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
17bc0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
17bd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
17be0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
17bf0 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50  *pPager, u16 *pP
17c00 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
17c10 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
17c20 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
17c30 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  de;.  if( rc==SQ
17c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
17c50 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
17c60 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
17c70 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
17c80 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
17c90 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
17ca0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
17cb0 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
17cc0 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  ( pageSize && pa
17cd0 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
17ce0 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26  pageSize .     &
17cf0 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & (pPager->memDb
17d00 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
17d10 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
17d20 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
17d30 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
17d40 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
17d50 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
17d60 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
17d70 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
17d80 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
17d90 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
17da0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17db0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
17dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
17dd0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17de0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
17df0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
17e00 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
17e10 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
17e20 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
17e30 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ce);.        pPa
17e40 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
17e50 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73   pNew;.        s
17e60 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
17e70 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
17e80 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
17e90 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
17ea0 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65  }.    *pPageSize
17eb0 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
17ec0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66  pageSize;.    if
17ed0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
17ee0 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
17ef0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
17f00 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
17f10 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
17f20 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
17f30 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
17f40 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
17f50 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
17f60 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
17f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17f80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
17f90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
17fa0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
17fb0 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
17fc0 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
17fd0 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
17fe0 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
17ff0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
18000 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
18010 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
18020 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
18030 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
18040 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
18050 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
18060 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
18070 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
18080 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
18090 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
180a0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
180b0 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
180c0 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
180d0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
180e0 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
180f0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
18100 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
18110 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
18120 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
18130 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
18140 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
18150 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
18160 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
18170 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
18180 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
18190 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
181a0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
181b0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
181c0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
181d0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
181e0 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
181f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18200 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
18210 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
18220 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
18230 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
18240 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
18250 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18260 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
18270 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
18280 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
18290 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
182a0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
182b0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
182c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
182d0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
182e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
182f0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
18300 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18310 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
18320 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
18330 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
18340 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
18350 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
18360 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
18370 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
18380 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
18390 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
183a0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
183b0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
183c0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
183d0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
183e0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
183f0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
18400 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
18410 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
18420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18430 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
18440 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
18450 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
18460 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
18470 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
18480 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
18490 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
184a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
184b0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
184c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
184d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
184e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
184f0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
18500 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
18510 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
18520 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
18530 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
18540 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
18550 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18560 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
18570 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
18580 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
18590 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
185a0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
185b0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
185c0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
185d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
185e0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
185f0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
18600 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
18610 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
18620 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
18630 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
18640 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
18650 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
18660 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
18670 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
18680 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
18690 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
186a0 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
186b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
186c0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
186d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
186e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
186f0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
18700 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
18710 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
18720 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
18730 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
18740 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
18750 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
18760 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
18770 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
18780 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
18790 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
187a0 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
187b0 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
187c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
187d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
187e0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
187f0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
18800 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
18810 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
18820 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
18830 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
18840 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
18850 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
18860 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
18870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
18880 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
18890 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
188a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
188b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
188c0 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  e );.  if( isOpe
188d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
188e0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
188f0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
18900 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
18910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
18920 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
18930 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
18940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18950 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18960 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
18970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18980 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
189a0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
189b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
189c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
189d0 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
189e0 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72  with pPager. Nor
189f0 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63  mally, this is c
18a00 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64  alculated as (<d
18a10 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61  b file size>/<pa
18a20 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f  ge-size>)..** Ho
18a30 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
18a40 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
18a50 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
18a60 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
18a70 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
18a80 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
18a90 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  age file..**.** 
18aa0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
18ab0 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
18ac0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18ad0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
18ae0 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73  n the.** error s
18af0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
18b00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18b10 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63  *pnPage left unc
18b20 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69  hanged. Or,.** i
18b30 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  f the file syste
18b40 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65 72  m has to be quer
18b50 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65  ied for the size
18b60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
18b70 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61 74  .** the query at
18b80 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e  tempt returns an
18b90 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49   IO error, the I
18ba0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
18bb0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
18bc0 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
18bd0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
18be0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
18bf0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
18c00 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51  cessful, then SQ
18c10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18c20 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
18c30 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
18c40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18c50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18c60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18c70 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
18c80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
18c90 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  t *pnPage){.  Pg
18ca0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
18cb0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
18cc0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
18cd0 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
18ce0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
18cf0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
18d00 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
18d10 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
18d20 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
18d30 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
18d40 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
18d50 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
18d60 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
18d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18d80 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  es in the file. 
18d90 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50  Store this in nP
18da0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  age. */.  if( pP
18db0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18dc0 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  d ){.    nPage =
18dd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
18de0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18df0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18e00 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72        /* Error r
18e10 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
18e20 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69  eSize() */.    i
18e30 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
18e40 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73         /* File s
18e50 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74  ize in bytes ret
18e60 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
18e70 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73  ize() */..    as
18e80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
18e90 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
18ea0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
18eb0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
18ec0 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30  Pager->fd) && (0
18ed0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
18ee0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
18ef0 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b  er->fd, &n))) ){
18f00 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
18f10 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
18f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
18f40 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
18f50 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
18f60 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20    nPage = 1;.   
18f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
18f80 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f  age = (Pgno)(n /
18f90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18fa0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
18fb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18fc0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
18fd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18fe0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
18ff0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
19000 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
19010 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
19020 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a  bSizeValid = 1;.
19030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19040 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
19050 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19060 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
19070 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a  eater than the .
19080 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
19090 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75  maximum pager nu
190a0 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74  mber, increase t
190b0 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74  he allowed limit
190c0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
190d0 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65  e file can be re
190e0 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ad..  */.  if( n
190f0 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50  Page>pPager->mxP
19100 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
19110 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
19120 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  o)nPage;.  }..  
19130 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
19140 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72  t variable and r
19150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19160 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20  */.  if( pnPage 
19170 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d  ){.    *pnPage =
19180 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
19190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
191a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
191b0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
191c0 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
191d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
191e0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
191f0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
19200 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
19210 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
19220 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
19230 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
19240 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
19250 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
19260 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
19270 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
19280 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
19290 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
192a0 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
192b0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
192c0 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
192d0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
192e0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
192f0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
19300 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
19310 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
19320 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
19330 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
19340 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
19350 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
19360 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
19370 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
19380 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
19390 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
193a0 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
193b0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
193c0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
193d0 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
193e0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
193f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
19400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19410 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
19420 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
19430 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
19440 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19470 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
19480 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
19490 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
194a0 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
194b0 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
194c0 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
194d0 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
194e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
194f0 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
19500 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
19510 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
19520 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
19530 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
19540 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
19550 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
19560 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
19570 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
19580 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
19590 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
195a0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
195b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
195c0 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
195d0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
195e0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
195f0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
19600 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
19610 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
19620 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
19630 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
19640 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
19650 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
19660 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
19670 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
19680 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
19690 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
196a0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
196b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
196c0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
196d0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
196e0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
196f0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
19700 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
19710 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
19720 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
19730 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
19740 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
19750 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
19760 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
19770 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
19780 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
19790 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
197a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
197b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
197c0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
197d0 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
197e0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
197f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
19800 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
19810 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
19820 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
19830 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19850 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
19860 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
19870 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
19880 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
19890 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
198a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
198b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
198c0 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
198d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
198e0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
198f0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
19900 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
19910 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
19920 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
19930 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
19940 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
19950 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
19960 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
19970 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
19980 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
19990 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
199a0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
199b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
199c0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
199d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
199e0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
199f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19a00 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
19a10 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
19a20 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  zeValid );.  ass
19a30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19a40 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
19a50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19a60 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
19a70 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65  ERVED );.  pPage
19a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
19a90 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  e;.}../*.** Shut
19aa0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
19ab0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
19ac0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
19ad0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
19ae0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19af0 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
19b00 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
19b10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
19b20 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
19b30 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
19b40 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
19b50 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
19b60 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
19b70 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
19b80 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
19b90 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
19ba0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
19bb0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
19bc0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
19bd0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
19be0 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
19bf0 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
19c00 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
19c10 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
19c20 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
19c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19c40 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
19c50 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
19c60 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
19c70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19c80 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
19c90 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
19ca0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
19cb0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
19cc0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
19cd0 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
19ce0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19cf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
19d00 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
19d10 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62  pPager){.  disab
19d20 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
19d30 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
19d40 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
19d50 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
19d60 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
19d70 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
19d80 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
19d90 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
19da0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
19db0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
19dc0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
19dd0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
19de0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
19df0 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
19e00 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
19e10 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
19e20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
19e30 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
19e40 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
19e50 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
19e60 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
19e70 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
19e80 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
19e90 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
19ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
19eb0 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
19ec0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
19ed0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
19ee0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
19ef0 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
19f00 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
19f10 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
19f20 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
19f30 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
19f40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19f50 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61  Hdr = -1;.    pa
19f60 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
19f70 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19f80 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
19f90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
19fa0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
19fb0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
19fc0 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
19fd0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
19fe0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
19ff0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
1a000 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1a010 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1a020 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
1a030 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
1a040 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a050 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
1a060 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
1a070 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
1a080 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1a090 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
1a0a0 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
1a0b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
1a0c0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
1a0d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
1a0e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
1a0f0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
1a100 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
1a110 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
1a120 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1a130 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
1a140 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
1a150 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
1a160 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
1a170 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a180 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1a190 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1a1a0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1a1b0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
1a1c0 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
1a1d0 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
1a1e0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
1a1f0 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
1a200 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1a210 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
1a220 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
1a230 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1a240 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
1a250 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a260 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
1a270 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1a280 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
1a290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1a2a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
1a2b0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
1a2c0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
1a2d0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
1a2e0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1a2f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
1a300 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
1a310 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
1a320 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
1a330 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
1a340 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1a350 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
1a360 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
1a370 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
1a380 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f  dSync flag is no
1a390 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  t set, then this
1a3a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a   function is a.*
1a3b0 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
1a3c0 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
1a3d0 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
1a3e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
1a3f0 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ode.** and the d
1a400 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1a410 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
1a420 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
1a430 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1a440 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
1a450 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
1a460 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
1a470 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
1a480 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
1a490 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
1a4a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1a4b0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
1a4c0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
1a4d0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
1a4e0 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
1a4f0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
1a500 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1a510 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
1a520 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
1a530 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
1a540 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1a550 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
1a560 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
1a570 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
1a580 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
1a590 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
1a5a0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
1a5b0 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
1a5c0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1a5d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1a5e0 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
1a5f0 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
1a600 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
1a610 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
1a620 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
1a630 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
1a640 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
1a650 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
1a660 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1a670 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
1a680 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
1a690 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
1a6a0 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
1a6b0 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
1a6c0 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
1a6d0 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
1a6e0 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
1a6f0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1a700 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
1a710 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
1a720 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
1a730 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
1a740 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
1a750 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1a760 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  }.**.** The Page
1a770 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1a780 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20  is never be set 
1a790 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a7a0 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66  les, or any.** f
1a7b0 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  ile operating in
1a7c0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50   no-sync mode (P
1a7d0 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20  ager.noSync set 
1a7e0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a  to non-zero)..**
1a7f0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1a800 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
1a810 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
1a820 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1a830 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
1a840 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
1a850 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
1a860 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
1a870 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
1a880 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
1a890 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
1a8a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
1a8b0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1a8c0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
1a8d0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
1a8e0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1a8f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1a900 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
1a910 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1a920 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a930 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a940 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1a950 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
1a960 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69  EMORY ){.      i
1a970 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a990 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a9a0 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  de */.      cons
1a9b0 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
1a9c0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a9d0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a9e0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
1a9f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1aa00 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
1aa10 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
1aa20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1aa30 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
1aa40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
1aa50 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
1aa60 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
1aa70 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
1aa80 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
1aa90 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
1aaa0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
1aab0 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
1aac0 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
1aad0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
1aae0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
1ab00 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
1ab10 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
1ab20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
1ab30 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1ab40 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
1ab50 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
1ab60 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1ab70 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
1ab80 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
1ab90 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
1aba0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1abb0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
1abc0 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ous connections 
1abd0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
1abe0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
1abf0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
1ac00 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
1ac10 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
1ac20 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
1ac30 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1ac40 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
1ac50 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
1ac60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1ac70 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
1ac80 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
1ac90 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1aca0 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
1acb0 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
1acc0 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
1acd0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
1ace0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
1acf0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
1ad00 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
1ad10 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
1ad20 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
1ad30 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
1ad40 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
1ad50 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
1ad60 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
1ad70 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
1ad80 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
1ad90 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
1ada0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
1adb0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1adc0 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
1add0 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
1ade0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
1adf0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
1ae00 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
1ae10 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
1ae20 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
1ae30 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
1ae40 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
1ae50 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
1ae60 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
1ae70 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
1ae80 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
1ae90 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
1aea0 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
1aeb0 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
1aec0 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1aed0 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
1aee0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1aef0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
1af00 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
1af10 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
1af20 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
1af30 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
1af40 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
1af50 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
1af60 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
1af70 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
1af80 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
1af90 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
1afa0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1afb0 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
1afc0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
1afd0 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 09 75 38  8 aMagic[8];..u8
1afe0 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
1aff0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
1b000 5d 3b 0a 0a 09 6d 65 6d 63 70 79 28 7a 48 65 61  ];...memcpy(zHea
1b010 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
1b020 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
1b030 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 09 70 75 74  nalMagic));..put
1b040 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1b050 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1b060 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1b070 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1b080 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1b090 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1b0a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1b0b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b0c0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1b0d0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1b0e0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1b0f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1b110 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1b120 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1b130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1b140 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1b150 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1b160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b170 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1b180 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1b190 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1b1a0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1b1b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b1c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1b1d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b1e0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b1f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b200 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1b210 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1b220 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1b230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b240 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1b250 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1b260 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1b270 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1b280 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1b290 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1b2a0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1b2b0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1b2c0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1b2d0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1b2e0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1b2f0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1b300 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1b310 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1b320 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1b330 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1b340 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1b350 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1b360 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1b370 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1b380 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1b390 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1b3a0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1b3b0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1b3c0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1b3d0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1b3e0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1b3f0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1b400 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1b410 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1b420 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b430 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1b440 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1b450 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1b460 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1b470 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1b480 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1b490 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1b4a0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1b4b0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1b4c0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1b4d0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1b4e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b4f0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1b500 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1b510 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1b520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b530 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1b540 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1b550 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1b560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1b570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1b580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1b590 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1b5a0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1b5b0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1b5c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b5d0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1b5e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1b600 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1b610 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1b620 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1b630 6e 61 6c 48 64 72 0a 09 29 3b 0a 20 20 20 20 20  nalHdr..);.     
1b640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b650 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b670 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
1b680 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1b690 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
1b6a0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1b6b0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1b6c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b6d0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
1b6e0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1b6f0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1b700 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b710 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1b720 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1b730 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
1b740 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
1b750 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
1b760 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
1b770 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1b780 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
1b790 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b7a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1b7b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b7c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1b7d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
1b7e0 20 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c   just successful
1b7f0 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50  ly synced. Set P
1b800 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  ager.needSync . 
1b810 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e     ** to zero an
1b820 64 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  d clear the PGHD
1b830 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1b840 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a   on all pagess..
1b850 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
1b860 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1b870 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1b880 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
1b890 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1b8a0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
1b8b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b8c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1b8d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b8e0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
1b8f0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
1b900 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
1b910 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
1b920 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
1b930 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
1b940 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
1b950 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
1b960 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
1b970 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1b980 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
1b990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b9a0 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
1b9b0 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
1b9c0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
1b9d0 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
1b9e0 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
1b9f0 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
1ba00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
1ba10 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
1ba20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
1ba30 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
1ba40 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
1ba50 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
1ba60 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
1ba70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1ba80 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
1ba90 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
1baa0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
1bab0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1bac0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
1bad0 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
1bae0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1baf0 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
1bb00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1bb10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1bb20 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
1bb30 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
1bb40 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
1bb50 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
1bb60 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
1bb70 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
1bb80 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
1bb90 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
1bba0 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
1bbb0 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
1bbc0 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
1bbd0 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
1bbe0 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
1bbf0 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
1bc00 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
1bc10 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
1bc20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1bc30 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
1bc40 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
1bc50 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
1bc60 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
1bc70 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
1bc80 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
1bc90 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
1bca0 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
1bcb0 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
1bcc0 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
1bcd0 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
1bce0 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
1bcf0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
1bd00 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
1bd10 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
1bd20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1bd30 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
1bd40 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
1bd50 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
1bd60 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
1bd70 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
1bd80 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
1bd90 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
1bda0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1bdb0 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
1bdc0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
1bdd0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
1bde0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bdf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
1be00 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
1be10 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1be20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1be30 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
1be40 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
1be50 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1be60 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
1be70 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
1be80 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
1be90 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
1bea0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
1beb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1bec0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1bed0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
1bee0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1bef0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1bf00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1bf10 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1bf20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1bf50 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69  de */..  if( pLi
1bf60 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
1bf70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
1bf80 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
1bf90 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
1bfa0 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
1bfb0 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
1bfc0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
1bfd0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
1bfe0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1bff0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
1c000 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
1c010 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
1c020 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
1c030 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
1c040 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
1c050 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
1c060 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
1c070 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
1c080 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
1c090 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
1c0a0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
1c0b0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
1c0c0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
1c0d0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
1c0e0 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
1c0f0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1c100 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
1c110 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
1c120 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
1c130 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
1c140 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
1c150 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
1c160 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
1c170 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
1c180 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
1c190 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
1c1a0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
1c1b0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
1c1c0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
1c1d0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
1c1e0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1c1f0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
1c200 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
1c210 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
1c220 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
1c230 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
1c240 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
1c250 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1c260 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
1c270 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
1c280 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
1c290 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1c2a0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
1c2b0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
1c2c0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
1c2d0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
1c2e0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
1c2f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1c300 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1c310 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1c320 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1c330 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1c340 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1c350 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
1c360 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
1c370 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
1c380 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
1c390 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
1c3a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1c3b0 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
1c3c0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1c3d0 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
1c3e0 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
1c3f0 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
1c400 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
1c410 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
1c420 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
1c430 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c440 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
1c450 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1c460 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
1c470 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
1c480 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
1c490 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
1c4a0 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
1c4b0 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  gs);.  }..  whil
1c4c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1c4d0 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
1c4e0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
1c4f0 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
1c500 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1c510 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
1c520 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
1c530 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1c540 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
1c550 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1c560 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
1c570 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1c580 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
1c590 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1c5a0 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1c5b0 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1c5c0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1c5d0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1c5e0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1c5f0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1c600 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1c610 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
1c620 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
1c630 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
1c640 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1c650 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
1c660 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
1c670 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
1c680 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1c690 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
1c6a0 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
1c6b0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
1c6c0 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
1c6d0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
1c6e0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1c6f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1c700 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
1c710 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
1c720 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
1c760 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 2f   */    ..      /
1c770 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
1c780 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
1c790 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
1c7a0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
1c7b0 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
1c7c0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
1c7d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
1c7e0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
1c7f0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
1c800 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1c810 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
1c820 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1c830 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
1c840 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
1c850 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
1c860 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
1c870 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
1c880 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
1c890 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
1c8a0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
1c8b0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
1c8c0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
1c8d0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
1c8e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c8f0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
1c900 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
1c910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1c920 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
1c930 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1c940 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c950 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
1c960 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1c970 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
1c980 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
1c990 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
1c9a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1c9b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1c9c0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
1c9d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   }..      /* Upd
1c9e0 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
1c9f0 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
1ca00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1ca10 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
1ca20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1ca30 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1ca40 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
1ca50 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
1ca60 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
1ca70 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
1ca80 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1ca90 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1caa0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1cab0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
1cac0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1cad0 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
1cae0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
1caf0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1cb00 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
1cb10 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1cb20 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
1cb30 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
1cb40 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1cb50 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d  ->nWrite);.    }
1cb60 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
1cb70 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
1cb80 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1cb90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1cba0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23   pgno));.    }.#
1cbb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1cbc0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
1cbd0 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
1cbe0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
1cbf0 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
1cc00 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
1cc10 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
1cc20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cc30 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
1cc40 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
1cc50 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
1cc60 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
1cc70 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69  ournal. .** It i
1cc80 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
1cc90 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20  sponsibility to 
1cca0 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73  use subjRequires
1ccb0 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20  Page() to check 
1ccc0 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72  .** that it is r
1ccd0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62  eally required b
1cce0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1ccf0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1cd00 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cd10 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
1cd20 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
1cd30 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
1cd40 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
1cd50 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
1cd60 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
1cd70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
1cd80 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1cd90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1cda0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
1cdb0 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
1cdc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
1cdd0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
1cde0 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
1cdf0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
1ce00 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
1ce10 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
1ce20 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
1ce30 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
1ce40 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
1ce50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ce60 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
1ce70 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
1ce80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ce90 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1cea0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1ceb0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1cec0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
1ced0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
1cee0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
1cef0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50   i64 offset = pP
1cf00 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
1cf10 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1cf20 65 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 44  e);.    char *pD
1cf30 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f 44 45 43  ata2;..    CODEC
1cf40 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1cf50 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
1cf60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1cf70 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
1cf80 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
1cf90 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1cfa0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1cfb0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1cfc0 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61  pgno));.  .    a
1cfd0 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75  ssert( pageInJou
1cfe0 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67  rnal(pPg) || pPg
1cff0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1d000 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
1d010 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1d020 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
1d030 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
1d040 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
1d050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d070 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
1d080 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
1d090 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1d0a0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a  ffset+4);.    }.
1d0b0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1d0c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1d0d0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
1d0e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1d0f0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
1d100 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
1d110 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
1d120 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
1d130 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74 65 73  ->pgno);.    tes
1d140 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d150 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 72 65  E_OK );.  }.  re
1d160 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1d170 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d180 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1d190 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
1d1a0 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
1d1b0 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
1d1c0 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
1d1d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d1e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1d1f0 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
1d200 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
1d210 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
1d220 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
1d230 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
1d240 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
1d250 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
1d260 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
1d270 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
1d280 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
1d290 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
1d2a0 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
1d2b0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1d2c0 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
1d2d0 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
1d2e0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
1d2f0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
1d300 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
1d310 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
1d320 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
1d330 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
1d340 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
1d350 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
1d360 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
1d370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d380 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
1d390 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
1d3a0 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
1d3b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
1d3c0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1d3d0 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
1d3e0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1d3f0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
1d400 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
1d410 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
1d420 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1d430 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
1d440 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
1d450 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
1d460 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1d470 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
1d480 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
1d490 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
1d4a0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
1d4b0 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
1d4c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1d4d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
1d4e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1d4f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d500 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
1d510 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
1d520 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
1d530 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
1d540 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1d550 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1d560 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
1d570 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1d580 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
1d590 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
1d5a0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
1d5b0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
1d5c0 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79    /* The doNotSy
1d5d0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62  nc flag is set b
1d5e0 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  y the sqlite3Pag
1d5f0 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  erWrite() functi
1d600 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a  on while it.  **
1d610 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20   is journalling 
1d620 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20  a set of two or 
1d630 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  more database pa
1d640 67 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f  ges that are sto
1d650 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  red.  ** on the 
1d660 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72  same disk sector
1d670 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f  . Syncing the jo
1d680 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c  urnal is not all
1d690 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20  owed while.  ** 
1d6a0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
1d6b0 67 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72  g as it is impor
1d6c0 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65  tant that all me
1d6d0 6d 62 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a  mbers of such a.
1d6e0 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65    ** set of page
1d6f0 73 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20  s are synced to 
1d700 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53  disk together. S
1d710 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74  o, if the page t
1d720 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
1d730 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 6d  * is trying to m
1d740 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72  ake clean will r
1d750 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1d760 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20 64 6f   sync and the do
1d770 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  NotSync.  ** fla
1d780 67 20 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e  g is set, return
1d790 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1d7a0 6e 79 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61  nything. The pca
1d7b0 63 68 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20  che layer will. 
1d7c0 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f   ** just have to
1d7d0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c   go ahead and al
1d7e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
1d7f0 65 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64  e buffer instead
1d800 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67   of.  ** reusing
1d810 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   pPg..  **.  ** 
1d820 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68  Similarly, if th
1d830 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
1d840 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
1d850 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
1d860 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  not.  ** try to 
1d870 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
1d880 74 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73  ts of pPg to dis
1d890 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  k..  */.  if( pP
1d8a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
1d8b0 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
1d8c0 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67  ync && pPg->flag
1d8d0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1d8e0 43 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  C) ){.    return
1d8f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d900 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
1d910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
1d920 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
1d930 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1d940 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
1d950 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
1d960 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1d970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d980 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
1d990 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20  ullSync && .    
1d9a0 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72    !(pPager->jour
1d9b0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
1d9c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
1d9d0 59 29 20 26 26 0a 20 20 20 20 20 20 21 28 73 71  Y) &&.      !(sq
1d9e0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1d9f0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1da00 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
1da10 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1da20 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D).    ){.      
1da30 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1da40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1da50 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1da60 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1da70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
1da80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
1da90 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
1daa0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
1dab0 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1dac0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1dad0 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
1dae0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1daf0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
1db00 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
1db10 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
1db20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1db30 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
1db40 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75  ll not.  ** actu
1db50 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
1db60 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
1db70 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
1db80 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
1db90 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
1dba0 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
1dbb0 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
1dbc0 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
1dbd0 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  nal page X>.  **
1dbe0 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
1dbf0 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41  e X>.  **     SA
1dc00 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a  VEPOINT sp;.  **
1dc10 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
1dc20 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1dc30 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20  Y pages>.  **   
1dc40 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
1dc50 70 61 67 65 20 58 29 0a 20 20 2a 2a 20 20 20 20  page X).  **    
1dc60 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
1dc70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58  .  **.  ** If (X
1dc80 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
1dc90 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
1dca0 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
1dcb0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
1dcc0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
1dcd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
1dce0 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
1dcf0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
1dd00 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f  e. Then,.  ** fo
1dd10 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
1dd20 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
1dd30 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
1dd40 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
1dd50 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
1dd60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dd70 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
1dd80 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
1dd90 20 58 20 61 73 20 69 74 0a 20 20 2a 2a 20 77 61   X as it.  ** wa
1dda0 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
1ddb0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
1ddc0 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
1ddd0 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
1dde0 22 0a 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75  ".  ** was execu
1ddf0 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
1de00 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
1de10 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
1de20 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
1de30 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
1de40 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
1de50 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
1de60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
1de70 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
1de80 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
1de90 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
1dea0 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
1deb0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1dec0 4f 20 73 70 22 20 69 73 20 0a 20 20 2a 2a 20 65  O sp" is .  ** e
1ded0 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
1dee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1def0 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
1df00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1df10 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1df20 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 63  e(pPg) ){.    rc
1df30 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
1df40 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(pPg);.  }..  /
1df50 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
1df60 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
1df70 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1df80 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1df90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dfa0 4b 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44  K ){.    pPg->pD
1dfb0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
1dfc0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1dfd0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1dfe0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1dff0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
1e000 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1e010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
1e020 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
1e030 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
1e040 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e050 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1e060 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e070 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
1e080 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
1e090 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1e0a0 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  , rc);.}.../*.**
1e0b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
1e0c0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
1e0d0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
1e0e0 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
1e0f0 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
1e100 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
1e110 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
1e120 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
1e130 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
1e140 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
1e150 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
1e160 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
1e170 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
1e180 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e190 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
1e1a0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
1e1b0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
1e1c0 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
1e1d0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1e1e0 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
1e1f0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
1e200 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
1e210 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
1e220 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
1e230 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
1e240 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
1e250 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
1e260 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
1e270 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
1e280 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
1e290 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
1e2a0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
1e2b0 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
1e2c0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1e2d0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
1e2e0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1e2f0 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
1e300 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
1e310 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1e320 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
1e330 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
1e340 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
1e350 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
1e360 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
1e370 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
1e380 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
1e390 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
1e3a0 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
1e3b0 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
1e3c0 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
1e3d0 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
1e3e0 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
1e3f0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
1e400 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
1e410 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
1e420 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
1e430 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
1e440 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
1e450 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
1e460 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
1e470 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
1e480 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
1e490 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
1e4a0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
1e4b0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
1e4c0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
1e4d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
1e4e0 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
1e4f0 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
1e500 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1e510 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1e520 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
1e530 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
1e540 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
1e550 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e560 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
1e570 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1e580 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
1e590 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
1e5a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
1e5b0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
1e5c0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
1e5d0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
1e5e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1e5f0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1e600 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
1e610 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
1e620 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
1e630 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
1e640 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
1e650 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
1e660 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
1e670 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1e680 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
1e690 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1e6a0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1e6b0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
1e6c0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
1e6d0 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
1e6e0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
1e6f0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1e700 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
1e710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e720 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
1e730 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e740 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
1e750 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1e760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1e770 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
1e780 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
1e790 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
1e7a0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1e7b0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
1e7c0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
1e7d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
1e7e0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
1e7f0 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
1e800 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
1e810 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
1e820 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  ) */.){.  u8 *pP
1e830 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
1e840 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
1e850 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
1e860 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
1e870 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
1e880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1e890 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e8a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
1e8b0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
1e8c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
1e8d0 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
1e8e0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
1e8f0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
1e900 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1e910 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e920 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
1e930 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
1e940 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
1e950 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1e960 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
1e970 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
1e980 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
1e990 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
1e9a0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
1e9b0 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
1e9c0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
1e9d0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
1e9e0 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
1e9f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1ea00 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
1ea10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ea20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
1ea30 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
1ea40 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
1ea50 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
1ea60 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
1ea70 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
1ea80 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
1ea90 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
1eaa0 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
1eab0 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
1eac0 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
1ead0 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
1eae0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
1eaf0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
1eb00 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
1eb10 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
1eb20 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36   PCache */.  u16
1eb30 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
1eb40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1eb50 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
1eb60 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
1eb70 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1eb80 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
1eb90 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
1eba0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
1ebb0 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
1ebc0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
1ebd0 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
1ebe0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
1ebf0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
1ec00 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
1ec10 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
1ec20 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
1ec30 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
1ec40 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
1ec50 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
1ec60 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
1ec70 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
1ec80 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
1ec90 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
1eca0 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
1ecb0 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
1ecc0 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
1ecd0 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
1ece0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
1ecf0 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
1ed00 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
1ed10 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
1ed20 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
1ed30 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
1ed40 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
1ed50 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
1ed60 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
1ed70 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
1ed80 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
1ed90 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
1eda0 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
1edb0 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
1edc0 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
1edd0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
1ede0 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
1edf0 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
1ee00 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
1ee10 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
1ee20 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
1ee30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
1ee40 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
1ee50 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
1ee60 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
1ee70 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
1ee80 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
1ee90 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
1eea0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
1eeb0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
1eec0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
1eed0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
1eee0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
1eef0 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
1ef00 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
1ef10 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
1ef20 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
1ef30 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
1ef40 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
1ef50 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1ef60 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
1ef70 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1ef80 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
1ef90 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
1efa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1efb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1efc0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1efd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
1efe0 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
1eff0 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
1f000 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
1f010 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
1f020 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
1f030 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
1f040 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
1f050 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
1f060 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
1f070 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
1f080 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
1f090 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
1f0a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f0b0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
1f0c0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
1f0d0 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
1f0e0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  thname);.    }..
1f0f0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
1f100 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1f110 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1f120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f130 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
1f140 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1f150 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
1f160 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
1f170 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
1f180 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
1f190 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
1f1a0 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
1f1b0 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
1f1c0 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
1f1d0 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
1f1e0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
1f1f0 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
1f200 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1f210 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
1f220 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
1f230 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
1f240 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
1f250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
1f260 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
1f270 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
1f280 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
1f290 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
1f2a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f2b0 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
1f2c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f2d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1f2e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f2f0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
1f300 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1f310 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
1f320 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
1f330 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1f340 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
1f350 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
1f360 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1f370 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1f380 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
1f390 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
1f3a0 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
1f3b0 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
1f3c0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
1f3d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
1f3e0 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
1f400 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
1f410 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
1f420 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
1f430 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1f440 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
1f450 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1f460 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
1f470 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
1f480 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
1f490 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1f4a0 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
1f4b0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
1f4c0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1f4d0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1f4e0 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
1f4f0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1f500 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
1f510 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
1f520 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
1f530 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
1f540 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
1f550 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
1f560 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f580 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
1f590 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
1f5a0 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
1f5b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
1f5c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
1f5d0 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
1f5e0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
1f5f0 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
1f600 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
1f610 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
1f620 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
1f630 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
1f640 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
1f650 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
1f660 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
1f670 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
1f680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f690 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
1f6a0 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
1f6b0 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
1f6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
1f6d0 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
1f6e0 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1f700 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
1f710 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1f720 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
1f730 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1f740 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1f750 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
1f760 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1f770 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f790 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
1f7a0 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
1f7b0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
1f7c0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
1f7d0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
1f7e0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
1f7f0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
1f800 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
1f810 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
1f820 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
1f830 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
1f840 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
1f850 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
1f860 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
1f870 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
1f880 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
1f890 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
1f8a0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
1f8b0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
1f8c0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
1f8d0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
1f8e0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
1f8f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
1f900 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1f910 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1f920 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
1f930 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1f940 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
1f950 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
1f960 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
1f970 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
1f980 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
1f990 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
1f9a0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
1f9b0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
1f9c0 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
1f9d0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
1f9e0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
1f9f0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1fa00 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
1fa10 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
1fa20 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
1fa30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
1fa40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
1fa50 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
1fa60 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69  rnal", 8);.    i
1fa70 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  f( pPager->zFile
1fa80 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61  name[0]==0 ) pPa
1fa90 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d  ger->zJournal[0]
1faa0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1fab0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
1fac0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
1fad0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
1fae0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
1faf0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
1fb00 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
1fb10 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
1fb20 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
1fb30 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
1fb40 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  !memDb ){.    in
1fb50 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb70 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
1fb80 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
1fb90 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1fba0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1fbb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1fbc0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
1fbd0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
1fbe0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
1fbf0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
1fc00 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
1fc10 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1fc20 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
1fc30 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
1fc40 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
1fc50 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
1fc60 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
1fc70 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
1fc80 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
1fc90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1fca0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
1fcb0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
1fcc0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
1fcd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1fce0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
1fcf0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
1fd00 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
1fd10 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1fd20 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1fd30 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
1fd40 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
1fd50 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
1fd60 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
1fd70 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
1fd80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fd90 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
1fda0 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
1fdb0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1fdc0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1fdd0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1fde0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
1fdf0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fe00 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
1fe10 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
1fe20 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
1fe30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1fe40 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
1fe50 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1fe60 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
1fe70 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
1fe80 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
1fe90 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fea0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
1feb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
1fec0 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29  PageDflt = (u16)
1fed0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1fee0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
1fef0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1ff00 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
1ff10 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
1ff20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
1ff30 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
1ff40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1ff50 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1ff60 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1ff70 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1ff80 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1ff90 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
1ffa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1ffb0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1ffc0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
1ffd0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
1ffe0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
1fff0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
20000 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
20010 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
20020 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
20030 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
20040 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
20050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
20060 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
20070 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
20080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
20090 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
200a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
200b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
200c0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
200d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
200e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
200f0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
20100 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
20110 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
20120 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
20130 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
20140 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
20150 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
20160 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
20170 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
20180 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
20190 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
201a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
201b0 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
201c0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
201d0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
201e0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
201f0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
20200 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
20210 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
20220 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
20230 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
20240 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
20250 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
20260 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
20270 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
20280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
20290 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
202a0 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e  SIVE;.    readOn
202b0 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
202c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
202d0 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
202e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
202f0 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
20300 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
20310 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
20320 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
20330 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
20340 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
20350 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
20360 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
20370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20390 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
203a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
203b0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
203c0 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
203d0 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
203e0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
203f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
20400 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
20410 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
20420 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
20430 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
20440 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
20450 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
20460 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
20470 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
20480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
20490 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
204a0 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
204b0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
204c0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
204d0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
204e0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
204f0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
20500 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
20510 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
20520 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
20530 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
20540 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
20550 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
20560 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
20570 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
20580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20590 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
205a0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
205b0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
205c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
205d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
205e0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
205f0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
20600 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
20610 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
20620 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
20630 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
20640 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
20650 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
20660 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
20670 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
20680 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
20690 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
206a0 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
206b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
206c0 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
206d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
206e0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
206f0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
20700 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20710 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
20720 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
20730 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
20740 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
20750 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
20760 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20770 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
20780 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
20790 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
207a0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
207b0 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
207c0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
207d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
207e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
207f0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
20800 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
20810 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
20820 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
20830 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
20840 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
20850 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
20860 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
20870 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
20880 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
20890 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
208a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
208b0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
208c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
208d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
208e0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
208f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
20900 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
20910 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
20920 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20930 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
20940 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
20950 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
20960 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
20970 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
20980 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
20990 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
209a0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
209b0 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65  nc = (pPager->te
209c0 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
209d0 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70  urnal) ?1:0;.  p
209e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
209f0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
20a00 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
20a10 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
20a20 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
20a30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
20a40 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
20a50 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
20a60 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
20a70 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
20a80 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
20a90 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
20aa0 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
20ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
20ac0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
20ad0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
20ae0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
20af0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
20b00 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
20b10 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
20b20 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
20b30 20 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20    if( memDb ){. 
20b40 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20b50 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
20b60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
20b70 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
20b80 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
20b90 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
20ba0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
20bb0 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
20bc0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
20bd0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
20be0 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
20bf0 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
20c00 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
20c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20c20 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
20c30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20c40 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
20c50 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
20c60 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
20c70 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
20c80 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
20c90 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
20ca0 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
20cb0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
20cc0 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
20cd0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
20ce0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
20cf0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
20d00 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
20d10 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
20d20 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
20d30 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
20d40 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
20d50 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
20d60 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
20d70 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
20d80 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
20d90 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
20da0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
20db0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
20dc0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
20dd0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
20de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
20df0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
20e00 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
20e10 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
20e20 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
20e30 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
20e40 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
20e50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20e60 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
20e70 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
20e80 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
20e90 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20ea0 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
20eb0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
20ec0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
20ed0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
20ee0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
20ef0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
20f00 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
20f10 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
20f20 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
20f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20f40 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
20f50 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
20f60 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
20f70 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
20f80 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
20f90 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
20fa0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
20fb0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
20fc0 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
20fd0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
20fe0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
20ff0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
21000 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
21010 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
21020 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
21030 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
21040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21050 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
21060 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
21070 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
21080 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
21090 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
210a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
210b0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
210c0 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
210d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
210e0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
210f0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
21100 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
21110 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
21120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21130 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
21140 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
21150 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
21160 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21170 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
21180 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
21190 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
211a0 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
211b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
211c0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
211d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
211e0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
211f0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
21200 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
21210 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
21220 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
21230 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
21240 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
21250 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
21260 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
21270 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
21280 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
21290 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
212a0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
212b0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
212c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
212d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
21300 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20  .  int exists;  
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
21330 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
21340 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esent */..  asse
21350 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
21360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21370 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
21380 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
21390 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
213a0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
213b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
213c0 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
213d0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
213e0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
213f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
21400 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
21410 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
21420 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21430 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
21440 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
21450 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
21460 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
21470 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
21480 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
21490 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
214a0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
214b0 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
214c0 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
214d0 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
214e0 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
214f0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
21500 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
21510 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
21520 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
21530 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
21540 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
21550 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
21560 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
21570 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
21580 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
21590 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
215a0 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
215b0 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
215c0 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
215d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
215e0 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
215f0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
21600 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
21610 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
21620 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
21630 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
21640 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
21650 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
21660 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
21670 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
21680 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
21690 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
216a0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
216b0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
216c0 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
216d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
216e0 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
216f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
21700 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  ge;..      /* Ch
21710 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eck the size of 
21720 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21730 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74  e. If it consist
21740 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20  s of 0 pages,.  
21750 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65      ** then dele
21760 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
21770 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61  ile. See the hea
21780 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  der comment abov
21790 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  e for .      ** 
217a0 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65  the reasoning he
217b0 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  re.  Delete the 
217c0 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
217d0 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20   file under.    
217e0 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20    ** a RESERVED 
217f0 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61  lock to avoid ra
21800 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e  ce conditions an
21810 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61  d to avoid viola
21820 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48  ting.      ** [H
21830 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f  33020]..      */
21840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21850 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
21860 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
21870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21890 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
218a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
218b0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
218c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
218d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
218e0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
218f0 45 53 45 52 56 45 44 0a 20 20 20 20 20 20 20 20  ESERVED.        
21900 20 20 20 20 20 20 20 20 20 7c 7c 20 20 73 71 6c           ||  sql
21910 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
21920 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
21930 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
21940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21950 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
21960 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
21970 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
21980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21990 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
219a0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
219b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
219c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
219d0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
219e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
219f0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
21a00 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
21a10 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
21a20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21a30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21a40 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
21a50 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
21a60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
21a70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
21a80 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
21a90 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
21aa0 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
21ab0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
21ac0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
21ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21ae0 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
21af0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
21b00 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
21b10 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
21b20 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
21b30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21b40 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
21b50 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
21b60 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
21b70 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
21b80 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
21b90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
21ba0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
21bb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
21bc0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
21bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
21be0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
21bf0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
21c00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21c10 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
21c20 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
21c30 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
21c40 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
21c50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21c70 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
21c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
21c90 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
21ca0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
21cb0 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
21cc0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21cd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21ce0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
21cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21d00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21d10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21d20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21d30 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
21d40 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
21d50 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
21d60 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
21d70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21d80 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
21d90 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
21da0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
21db0 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
21dc0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
21dd0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
21de0 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
21df0 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
21e00 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
21e10 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
21e20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
21e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21e40 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
21e50 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
21e60 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
21e70 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
21e80 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
21e90 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
21ea0 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
21eb0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
21ec0 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
21ed0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
21ee0 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
21ef0 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
21f00 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
21f10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
21f20 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
21f30 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
21f40 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
21f50 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
21f60 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
21f70 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
21f80 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
21f90 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
21fb0 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
21fc0 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
21fd0 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
21fe0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
21ff0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
22000 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22010 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
22020 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22040 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22050 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
22060 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
22070 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
22080 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
22090 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
220a0 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
220b0 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
220c0 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
220d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
220e0 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
220f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22100 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
22110 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
22120 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
22130 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
22140 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
22150 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
22160 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
22170 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
22180 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
22190 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
221a0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
221b0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
221c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
221d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
221e0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
221f0 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
22200 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
22210 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
22220 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
22230 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
22240 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
22250 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
22260 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
22270 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
22280 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
22290 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
222b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
222c0 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
222f0 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66  f file to read f
22300 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rom */..  assert
22310 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
22320 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26 26  =PAGER_SHARED &&
22330 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66   !MEMDB );..  if
22340 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
22350 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
22360 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
22370 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d  pFile );.    mem
22380 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
22390 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
223a0 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ize);.    return
223b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
223c0 20 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e    iOffset = (pgn
223d0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
223e0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63  ->pageSize;.  rc
223f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
22400 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
22410 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  ->pData, pPager-
22420 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73  >pageSize, iOffs
22430 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
22440 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
22450 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63  T_READ ){.    rc
22460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22470 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  }.  if( pgno==1 
22480 29 7b 0a 20 20 20 20 75 38 20 2a 64 62 46 69 6c  ){.    u8 *dbFil
22490 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
224a0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
224b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
224c0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
224d0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
224e0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
224f0 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43  eVers));.  }.  C
22500 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
22510 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
22520 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
22530 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f  OMEM);..  PAGER_
22540 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
22550 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
22560 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
22570 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
22580 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
22590 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
225a0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
225b0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
225c0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
225d0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
225e0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
225f0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
22600 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
22610 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
22620 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
22630 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22640 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
22650 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
22660 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22670 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
22680 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
22690 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
226a0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
226b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
226c0 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
226d0 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
226e0 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
226f0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
22700 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
22710 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
22720 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
22730 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
22740 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
22750 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
22760 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
22770 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
22780 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
22790 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
227a0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f  UNLOCK state (no
227b0 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
227c0 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
227d0 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
227e0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
227f0 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
22800 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
22810 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
22820 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
22830 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
22840 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
22850 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
22860 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
22870 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
22880 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
22890 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
228a0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
228b0 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
228c0 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
228d0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
228e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
228f0 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
22900 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
22910 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
22920 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
22930 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
22940 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
22950 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
22960 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
22970 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
22980 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
22990 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
229a0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
229b0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
229c0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
229d0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
229e0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
229f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
22a00 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
22a10 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
22a20 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
22a30 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
22a40 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
22a50 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
22a60 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
22a70 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
22a80 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
22a90 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
22aa0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
22ab0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
22ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
22ad0 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62  peration describ
22ae0 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20  ed by (2) above 
22af0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
22b00 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20  , and if the.** 
22b10 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
22b20 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
22b30 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
22b40 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  L when this is c
22b50 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  alled,.** the er
22b60 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
22b70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
22b80 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65  . It is permitte
22b90 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a  d to read the.**
22ba0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69   database when i
22bb0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
22bc0 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
22bd0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
22be0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
22bf0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
22c00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
22c10 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f  If an.** IO erro
22c20 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  r occurs while l
22c30 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
22c40 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
22c50 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  r a hot-journal.
22c60 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69  ** file or rolli
22c70 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
22c80 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
22c90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
22ca0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
22cb0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
22cc0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
22cd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
22ce0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
22cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22d00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
22d10 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d  t isErrorReset =
22d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22d30 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f   /* True if reco
22d40 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f  vering from erro
22d50 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
22d60 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
22d70 65 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  e has no outstan
22d80 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
22d90 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nces and is in a
22da0 6e 20 0a 20 20 2a 2a 20 65 72 72 6f 72 2d 73 74  n .  ** error-st
22db0 61 74 65 2c 20 74 68 69 73 20 69 73 20 61 20 63  ate, this is a c
22dc0 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 20 74  hance to clear t
22dd0 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72  he error. Discar
22de0 64 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74  d the .  ** cont
22df0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
22e00 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  r-cache and roll
22e10 62 61 63 6b 20 61 6e 79 20 68 6f 74 20 6a 6f 75  back any hot jou
22e20 72 6e 61 6c 20 69 6e 20 74 68 65 0a 20 20 2a 2a  rnal in the.  **
22e30 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20   file-system..  
22e40 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
22e50 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
22e60 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
22e70 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20  >pPCache)==0 && 
22e80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22e90 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  ){.    if( isOpe
22ea0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
22eb0 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  | pPager->zJourn
22ec0 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72  al ){.      isEr
22ed0 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20  rorReset = 1;.  
22ee0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
22ef0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
22f00 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  _OK;.    pager_r
22f10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
22f20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
22f30 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
22f40 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
22f50 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
22f60 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
22f70 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
22f80 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
22f90 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
22fa0 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
22fb0 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
22fc0 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
22fd0 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
22fe0 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
22ff0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
23000 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
23010 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
23020 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
23030 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
23040 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
23050 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
23060 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
23070 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
23080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
23090 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
230a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
230b0 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72     int isHotJour
230c0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  nal = 0;.    ass
230d0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
230e0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
230f0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
23100 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23110 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
23120 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
23130 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
23140 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
23150 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
23160 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
23170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
23190 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
231a0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
231b0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
231c0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
231d0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
231e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
231f0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
23200 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
23210 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
23220 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
23230 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ARED;.    }.    
23240 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23250 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
23260 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
23270 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
23280 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
23290 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
232a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
232b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
232c0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
232d0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
232e0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
232f0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
23300 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
23310 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  et ){.      rc =
23320 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
23330 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75  Pager, &isHotJou
23340 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
23350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23360 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
23370 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
23380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45     }.    if( isE
23390 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
233a0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
233b0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
233c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
233d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
233e0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
233f0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
23400 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
23410 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
23420 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
23430 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
23440 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
23450 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
23460 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
23470 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
23480 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
23490 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
234a0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
234b0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
234c0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
234d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
234e0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
234f0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
23500 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
23510 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
23520 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
23530 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
23540 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
23550 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
23560 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
23570 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
23580 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
23590 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
235a0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
235b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
235c0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
235d0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
235e0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
235f0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
23600 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
23610 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
23620 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23630 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
23640 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
23650 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
23660 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
23670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23680 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
23690 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
236a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
236b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
236c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
236d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
236e0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
236f0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23710 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
23720 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
23730 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
23740 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
23750 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
23760 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
23770 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
23780 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
23790 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
237a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
237b0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
237c0 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
237d0 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
237e0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
237f0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
23800 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
23810 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
23820 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
23830 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
23840 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
23850 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
23860 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
23870 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
23880 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
23890 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
238a0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d) ){.        in
238b0 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
238c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
238d0 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
238e0 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
238f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
23900 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
23910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23930 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
23940 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
23950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
23960 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
23970 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
23980 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
23990 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
239a0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
239b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
239c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
239d0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
239e0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
239f0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
23a00 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
23a10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23a30 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
23a40 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
23a50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23a60 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
23a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23a80 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
23a90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23aa0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
23ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ac0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
23ad0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
23ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23b00 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
23b10 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
23b20 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
23b30 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
23b40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
23b50 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
23b60 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
23b70 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
23b80 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
23b90 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
23ba0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
23bb0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
23bc0 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
23bd0 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   it .           
23be0 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
23bf0 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
23c00 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
23c10 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
23c20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
23c30 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
23c40 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
23c50 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
23c60 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
23c70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23c80 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
23c90 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
23ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23cb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23cc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23cd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
23ce0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
23cf0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
23d00 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20  : Why are these 
23d10 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73  cleared here? Is
23d20 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a   it necessary? *
23d30 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
23d40 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
23d50 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
23d60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
23d70 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23d80 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
23d90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23da0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
23db0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
23dc0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
23dd0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
23de0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
23df0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
23e00 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
23e10 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
23e20 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
23e30 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
23e40 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
23e50 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
23e60 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
23e70 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
23e80 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
23e90 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  cache..      */.
23ea0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
23eb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
23ec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
23ed0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
23ee0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
23ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23f10 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
23f20 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
23f30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23f40 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23f60 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
23f70 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
23f80 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D).           ||
23f90 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
23fa0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
23fb0 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
23fc0 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
23fd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
23fe0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
23ff0 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
24000 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
24010 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
24020 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
24030 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
24040 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
24050 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24060 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
24070 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
24080 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
24090 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
240a0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
240b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
240c0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
240d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
240e0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
240f0 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
24100 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
24110 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
24120 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
24130 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
24140 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
24150 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
24160 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
24170 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
24180 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
24190 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
241a0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
241b0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
241c0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
241d0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
241e0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
241f0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
24200 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
24210 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
24220 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
24230 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
24240 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
24250 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
24260 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
24270 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
24280 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
24290 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
242a0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
242b0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
242c0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
242d0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
242e0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
242f0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
24300 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
24310 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
24320 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
24330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
24340 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
24350 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
24360 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
24370 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
24380 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
24390 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
243a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
243b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
243c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
243d0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
243e0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
243f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24400 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
24410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
24420 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
24430 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
24440 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
24450 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
24460 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
24470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24480 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
24490 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
244a0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
244b0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
244c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
244d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
244e0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
244f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24510 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
24520 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
24530 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
24540 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
24550 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
24560 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
24570 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
24580 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
24590 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
245a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
245b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
245c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
245d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
245e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
245f0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
24600 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
24610 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24620 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
24630 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  _unlock() is a n
24640 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69  o-op for exclusi
24650 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d  ve mode and in-m
24660 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
24670 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   */.    pager_un
24680 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
24690 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
246a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
246b0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
246c0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
246d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
246e0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
246f0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
24700 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
24710 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
24720 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
24730 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
24740 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
24750 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
24760 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
24770 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
24780 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
24790 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
247a0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
247b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
247c0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
247d0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
247e0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
247f0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
24800 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
24810 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
24820 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20  ache)==0).   && 
24830 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  (!pPager->exclus
24840 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
24850 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
24860 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72   .  ){.    pager
24870 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
24880 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
24890 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70  ../*.** Drop a p
248a0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63  age from the cac
248b0 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  he using sqlite3
248c0 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a  PcacheDrop()..**
248d0 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e  .** If this mean
248e0 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20  s there are now 
248f0 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20 72 65  no pages with re
24900 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d  ferences to them
24910 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  , a rollback.** 
24920 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
24930 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
24940 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a  ase is removed..
24950 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
24960 61 67 65 72 44 72 6f 70 50 61 67 65 28 44 62 50  agerDropPage(DbP
24970 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
24980 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
24990 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69  ->pPager;.  sqli
249a0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
249b0 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  g);.  pagerUnloc
249c0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
249d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
249e0 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
249f0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
24a00 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
24a10 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
24a20 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
24a30 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
24a40 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
24a50 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
24a60 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
24a70 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
24a80 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
24a90 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24aa0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
24ab0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
24ac0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
24ad0 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
24ae0 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
24af0 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
24b00 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
24b10 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
24b20 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
24b30 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
24b40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24b50 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
24b60 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
24b70 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
24b80 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
24b90 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
24ba0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
24bb0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
24bc0 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
24bd0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
24be0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
24bf0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
24c00 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
24c10 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
24c20 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
24c30 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
24c40 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
24c50 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
24c60 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
24c70 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
24c80 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
24c90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24ca0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
24cb0 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
24cc0 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
24cd0 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
24ce0 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
24cf0 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
24d00 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
24d10 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
24d20 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
24d30 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
24d40 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
24d50 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
24d60 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
24d70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
24d80 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
24d90 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
24da0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
24db0 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
24dc0 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
24dd0 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
24de0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
24df0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
24e00 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
24e10 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
24e20 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
24e30 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
24e40 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
24e50 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
24e60 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
24e70 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
24e80 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
24e90 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
24ea0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
24eb0 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
24ec0 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
24ed0 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
24ee0 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
24ef0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
24f00 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
24f10 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
24f20 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
24f30 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
24f40 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
24f50 65 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c  e cache to popul
24f60 61 74 65 20 77 69 74 68 20 74 68 65 20 64 61 74  ate with the dat
24f70 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
24f80 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
24f90 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
24fa0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
24fb0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
24fc0 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
24fd0 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
24fe0 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
24ff0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25000 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
25010 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
25020 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
25030 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
25040 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
25050 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
25060 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
25070 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
25080 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
25090 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
250a0 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
250b0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
250c0 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
250d0 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
250e0 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
250f0 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
25100 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
25110 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
25120 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
25130 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
25140 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
25150 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
25160 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
25170 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
25180 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
25190 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
251a0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
251b0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
251c0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
251d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
251e0 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
251f0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
25200 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
25210 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
25220 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
25230 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
25240 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
25250 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
25260 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
25270 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
25280 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
25290 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
252a0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
252b0 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
252c0 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
252d0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
252e0 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
252f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
25300 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
25310 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
25320 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
25330 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
25340 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
25350 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
25360 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
25370 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
25380 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
25390 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
253a0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
253b0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
253c0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
253d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
253e0 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
253f0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
25400 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
25410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25420 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
25430 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
25440 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
25450 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
25460 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
25470 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
25480 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
25490 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
254a0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
254b0 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
254c0 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
254d0 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
254e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
254f0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
25500 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
25510 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
25520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25530 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
25540 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  R_UNLOCK );..  i
25550 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
25560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25570 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25580 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
25590 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
255a0 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
255b0 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
255c0 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
255d0 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
255e0 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
255f0 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
25600 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
25610 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
25620 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
25630 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
25640 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
25650 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
25660 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
25670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
25680 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
25690 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
256a0 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
256b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
256c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
256d0 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
256e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
256f0 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
25700 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
25710 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
25720 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
25730 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
25740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
25750 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
25760 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
25770 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
25780 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
25790 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
257a0 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
257b0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
257c0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
257d0 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
257e0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
257f0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
25800 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
25810 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
25820 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
25830 61 67 65 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a  age)->pPager ){.
25840 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
25850 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
25860 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
25870 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
25880 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
25890 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
258a0 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
258b0 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 50 41 47 45  do.  */.    PAGE
258c0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
258d0 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Hit);.    return
258e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
258f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
25900 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
25910 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
25920 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
25930 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
25940 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
25950 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  .  */.    int nM
25960 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49  ax;..    PAGER_I
25970 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
25980 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
25990 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
259a0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
259b0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
259c0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
259d0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
259e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
259f0 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
25a00 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
25a10 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
25a20 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
25a30 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
25a40 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
25a50 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
25a60 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
25a70 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
25a80 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
25a90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25aa0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
25ab0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25ac0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
25ad0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25ae0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
25af0 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
25b00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25b10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
25b20 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
25b30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25b40 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  nMax<(int)pgno |
25b50 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e  | MEMDB || noCon
25b60 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tent ){.      if
25b70 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
25b80 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53  xPgno ){..rc = S
25b90 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74  QLITE_FULL;..got
25ba0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
25bb0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
25bc0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
25bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
25be0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
25bf0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
25c00 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
25c10 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
25c20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
25c30 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
25c40 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
25c50 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
25c60 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
25c70 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
25c80 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
25c90 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
25ca0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
25cb0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
25cc0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
25cd0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
25ce0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
25cf0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
25d00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
25d10 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
25d20 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
25d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
25d40 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
25d50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25d60 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
25d70 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
25d80 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
25d90 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
25da0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
25db0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
25dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
25dd0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25de0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
25df0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
25e00 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
25e10 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
25e20 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
25e30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
25e40 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
25e50 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
25e60 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
25e70 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
25e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
25e90 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
25ea0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
25eb0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
25ec0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
25ed0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
25ee0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
25ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25f00 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
25f10 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
25f20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
25f30 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
25f40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  OK ){.        pa
25f60 67 65 72 44 72 6f 70 50 61 67 65 28 70 50 67 29  gerDropPage(pPg)
25f70 3b 0a 09 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  ;..pPg = 0;.    
25f80 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
25f90 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
25fa0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
25fb0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
25fc0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
25fd0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
25fe0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
25ff0 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
26000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
26010 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
26020 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
26030 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
26040 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
26050 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  pPg);.  pagerUnl
26060 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
26070 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  er);.  *ppPage =
26080 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
26090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
260a0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
260b0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
260c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
260d0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
260e0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
260f0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
26100 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
26110 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
26120 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
26130 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
26140 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
26150 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
26160 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
26170 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
26180 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
26190 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
261a0 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
261b0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
261c0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
261d0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
261e0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
261f0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
26200 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
26210 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
26220 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
26230 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
26240 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
26250 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
26260 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
26270 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
26280 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
26290 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
262a0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
262b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
262c0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
262d0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
262e0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
262f0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
26300 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
26310 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
26320 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
26330 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
26340 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
26350 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
26360 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
26370 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
26380 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
26390 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67  OCK).   && (pPag
263a0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
263b0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
263c0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
263d0 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20  E_FULL).  ){.   
263e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
263f0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
26400 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
26410 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
26420 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
26430 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
26440 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
26450 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
26460 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
26470 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
26480 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
26490 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
264a0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
264b0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
264c0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
264d0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
264e0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
264f0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
26500 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26510 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
26520 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26530 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
26540 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
26550 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
26560 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
26570 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
26580 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
26590 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
265a0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
265b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
265c0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  /*.** If the mai
265d0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
265e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
265f0 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74  opened, ensure t
26600 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a  hat the.** sub-j
26610 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
26620 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20  pen too. If the 
26630 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
26640 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69  not open,.** thi
26650 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26660 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
26670 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26680 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
26690 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
266a0 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20  to plan. .** An 
266b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
266c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
266d0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
266e0 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  l to .** sqlite3
266f0 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a  OsOpen() fails..
26700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
26710 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
26720 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26740 4b 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  K;.  if( isOpen(
26750 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
26760 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26770 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
26780 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26790 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
267a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
267b0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
267c0 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
267d0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
267e0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
267f0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
26800 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26810 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
26820 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
26830 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
26840 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
26850 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26860 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26870 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26880 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
26890 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
268a0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
268b0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
268c0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
268d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
268e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
268f0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
26900 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26910 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
26920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26930 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
26940 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
26950 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
26960 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
26970 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
26980 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
26990 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
269a0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
269b0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
269c0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
269d0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
269e0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
269f0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
26a00 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
26a10 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
26a20 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
26a30 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
26a40 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
26a50 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
26a60 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
26a70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26a80 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
26a90 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
26aa0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
26ab0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
26ac0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
26ad0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
26ae0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
26af0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
26b00 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
26b10 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
26b20 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
26b30 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
26b40 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26b50 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
26b60 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
26b70 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
26b80 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
26b90 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
26ba0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
26bb0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
26bc0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
26bd0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
26be0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
26bf0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
26c00 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
26c10 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
26c20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
26c30 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
26c40 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
26c50 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
26c60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
26c70 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
26c80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26c90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26ca0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
26cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
26cc0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
26cd0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
26ce0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
26cf0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
26d00 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
26d10 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
26d20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
26d30 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
26d40 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
26d50 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
26d60 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
26d70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
26d80 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
26d90 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
26da0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
26db0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26dc0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
26dd0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
26de0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
26df0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26e00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f  ;.  }..  /* TODO
26e10 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70  : Is it really p
26e20 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68  ossible to get h
26e30 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56  ere with dbSizeV
26e40 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c  alid==0? If not,
26e50 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74  .  ** the call t
26e60 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o PagerPagecount
26e70 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  () can be remove
26e80 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  d..  */.  testca
26e90 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
26ea0 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
26eb0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26ec0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
26ed0 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  ;..  pPager->pIn
26ee0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
26ef0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
26f00 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
26f10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
26f20 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
26f30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26f40 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
26f50 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26f60 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
26f70 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
26f80 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
26f90 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26fa0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
26fb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
26fc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26fd0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
26fe0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
26ff0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
27000 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
27010 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
27020 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
27030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
27040 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
27050 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
27060 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
27070 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
27080 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
27090 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
270a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
270b0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
270c0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
270d0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
270e0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
270f0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
27100 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
27110 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
27120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27130 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
27140 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27150 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
27160 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
27170 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
27180 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
27190 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
271a0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
271b0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
271c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
271d0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
271e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
271f0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
27200 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
27210 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
27220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
27230 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27240 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
27250 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
27260 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
27270 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
27280 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
27290 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
272a0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
272b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
272c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
272d0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
272e0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
272f0 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
27300 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
27310 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
27320 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
27330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
27340 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
27350 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
27360 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
27370 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
27380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
27390 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
273a0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
273b0 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
273c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
273d0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
273e0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
273f0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
27400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27410 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
27420 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
27430 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
27440 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
27450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27460 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
27470 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
27480 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
27490 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
274a0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
274b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
274c0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
274d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
274e0 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
274f0 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
27500 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
27510 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
27520 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
27530 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
27540 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
27550 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
27560 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
27570 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
27580 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
27590 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
275a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
275b0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
275c0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
275d0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
275e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
275f0 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
27600 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
27610 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
27620 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
27630 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
27640 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
27650 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
27660 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
27670 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
27680 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
27690 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
276a0 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
276b0 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
276c0 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
276d0 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
276e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
276f0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
27700 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
27710 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
27720 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
27730 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
27740 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
27750 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
27760 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
27770 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
27780 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
27790 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
277a0 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
277b0 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
277c0 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
277d0 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  of it..**.** If 
277e0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
277f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
27800 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
27810 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
27820 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
27830 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
27840 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
27850 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
27860 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
27870 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
27880 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
27890 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
278a0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
278b0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
278c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
278d0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
278e0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
278f0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
27900 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
27910 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
27920 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
27930 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
27940 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
27950 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
27960 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
27970 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
27980 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
27990 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
279a0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
279b0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
279c0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
279d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
279e0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
279f0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
27a00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27a20 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
27a30 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61  _UNLOCK );.  pPa
27a40 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
27a50 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
27a60 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67  mory;.  if( pPag
27a70 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
27a80 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
27a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
27aa0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
27ab0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
27ac0 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
27ad0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
27ae0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
27af0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
27b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27b10 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
27b20 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69  rameter.    ** i
27b30 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
27b40 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
27b50 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
27b60 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
27b70 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
27b80 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
27b90 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
27ba0 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
27bb0 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
27bc0 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
27bd0 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
27be0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
27bf0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27c00 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27c10 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
27c20 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
27c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27c40 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
27c50 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
27c60 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69  ESERVED;.      i
27c70 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
27c80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
27c90 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
27ca0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
27cb0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
27cc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
27cd0 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
27ce0 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75  s were successfu
27cf0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70  lly obtained, op
27d00 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  en the journal. 
27d10 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77     ** file and w
27d20 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
27d30 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f  ournal-header to
27d40 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
27d50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27d60 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  K && pPager->use
27d70 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20  Journal.     && 
27d80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27d90 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
27da0 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
27db0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
27dc0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
27dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
27de0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
27df0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27e00 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
27e10 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
27e20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
27e30 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
27e40 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
27e50 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
27e60 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
27e70 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
27e80 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
27e90 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
27ea0 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
27eb0 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
27ec0 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
27ed0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
27ee0 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
27ef0 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
27f00 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
27f10 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
27f20 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
27f30 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
27f40 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
27f50 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
27f60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27f70 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
27f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27f90 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
27fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27fb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27fc0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
27fd0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
27fe0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
27ff0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
28000 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
28010 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28020 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
28030 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28040 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
28050 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
28060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28070 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
28090 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62  ert( !pPager->db
280a0 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20  Modified );.    
280b0 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f  /* Ignore any IO
280c0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
280d0 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  rs within pager_
280e0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
280f0 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75  ). The.    ** pu
28100 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
28110 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
28120 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
28130 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
28140 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d     ** sub-system
28150 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  . It doesn't mat
28160 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ter if the journ
28170 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  al-file is not p
28180 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66  roperly.    ** f
28190 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
281a0 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
281b0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
281c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
281d0 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  way)..    */.   
281e0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
281f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
28200 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
28220 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
28230 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
28240 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
28250 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
28260 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
28270 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
28280 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
28290 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
282a0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
282b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
282c0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
282d0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
282e0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
282f0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
28300 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
28310 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
28320 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
28330 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
28340 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
28350 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
28360 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
28370 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
28380 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
28390 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
283a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
283b0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
283c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
283d0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
283e0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
283f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28400 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
28410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
28420 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
28430 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
28440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28450 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
28460 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
28470 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
28480 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
28490 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
284a0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
284b0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
284c0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
284d0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
284e0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
284f0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
28500 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
28510 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
28520 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
28530 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
28540 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
28550 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
28560 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
28570 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
28580 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
28590 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
285a0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
285b0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
285c0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
285d0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
285e0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
285f0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
28600 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
28610 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
28620 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
28630 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
28640 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
28650 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
28660 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
28670 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
28680 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
28690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
286a0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
286b0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
286c0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
286d0 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
286e0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
286f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28720 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
28730 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
28740 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
28750 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
28760 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
28770 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
28780 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  l.          && p
28790 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
287a0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
287b0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
287c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
287d0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
287e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
287f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28810 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
28820 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
28830 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
28840 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
28850 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
28860 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
28870 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
28880 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
28890 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
288a0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
288b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
288c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
288d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
288e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
288f0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
28900 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
28910 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
28920 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
28930 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
28940 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
28950 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
28960 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
28970 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
28980 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
28990 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
289a0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
289b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
289c0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
289d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
289e0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
289f0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
28a00 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
28a10 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
28a20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
28a30 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
28a40 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
28a50 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
28a60 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
28a70 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
28a80 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
28a90 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
28aa0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
28ab0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
28ac0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
28ad0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
28ae0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
28af0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28b00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28b20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28b50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28b60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28b70 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
28b80 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
28bb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
28bc0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
28bd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28be0 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
28bf0 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
28c00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28c20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
28c30 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
28c40 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
28c50 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
28c60 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
28c70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28c80 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
28c90 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28ca0 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
28cb0 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
28cc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28ce0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28cf0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
28d00 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
28d10 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
28d20 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
28d30 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
28d40 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
28d50 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
28d60 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
28d70 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28d80 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
28d90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28da0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
28db0 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
28dc0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
28dd0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
28de0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
28df0 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
28e00 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
28e10 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
28e20 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
28e30 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
28e40 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
28e50 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
28e60 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
28e70 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
28e80 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
28e90 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
28ea0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
28eb0 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
28ec0 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
28ed0 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
28ee0 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
28ef0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
28f00 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
28f10 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
28f20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28f30 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
28f40 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28f50 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
28f60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
28f70 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
28f80 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
28f90 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
28fa0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
28fb0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
28fc0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
28fd0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
28fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
28ff0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
29000 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
29010 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
29020 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
29030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29040 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
29050 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
29060 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
29070 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
29080 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
29090 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
290a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
290b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
290c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
290d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
290e0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
290f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
29100 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
29110 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29120 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
29130 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
29140 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
29150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29160 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
29170 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
29180 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
29190 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
291a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
291b0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
291c0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
291d0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
291e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
291f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29210 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
29220 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
29230 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29240 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
29250 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
29260 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
29270 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
29280 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
29290 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
292a0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
292b0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
292c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
292d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
292e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
292f0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
29300 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
29310 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29320 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
29330 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
29350 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
29360 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
29370 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
29380 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
29390 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
293a0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
293b0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
293c0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
293d0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
293e0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
293f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
29400 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
29410 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
29420 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
29430 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
29440 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
29450 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
29460 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
29470 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
29480 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
29490 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
294a0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
294b0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
294c0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
294d0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
294e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
294f0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
29500 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
29510 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29520 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
29530 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
29540 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
29550 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
29560 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
29570 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
29580 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
295a0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
295b0 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
295c0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
295d0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
295e0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
295f0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
29600 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
29610 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
29620 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
29630 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
29640 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
29650 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
29660 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
29670 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
29680 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
29690 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
296a0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
296b0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
296c0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
296d0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
296e0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
296f0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
29700 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
29710 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
29720 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
29730 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
29740 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
29750 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
29760 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
29770 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
29780 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
29790 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
297a0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
297b0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
297c0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
297d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
297e0 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
297f0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
29800 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
29810 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29820 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
29830 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
29840 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29850 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
29860 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
29870 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29880 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
29890 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
298a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
298b0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
298c0 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
298d0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
298e0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
298f0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
29900 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
29910 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
29920 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
29930 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
29940 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29950 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29960 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29970 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
29980 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
29990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
299a0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
299b0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
299c0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
299d0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
299e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
299f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
29a00 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
29a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29a20 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
29a30 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29a40 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
29a50 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
29a60 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
29a70 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
29a80 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
29a90 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
29aa0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
29ab0 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
29ac0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
29ad0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
29ae0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29af0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
29b00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
29b10 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
29b20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
29b30 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
29b40 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
29b50 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
29b60 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
29b70 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
29b80 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
29b90 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
29ba0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
29bb0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
29bc0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
29bd0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
29be0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
29bf0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
29c00 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
29c10 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
29c20 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
29c30 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
29c40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29c50 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
29c60 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
29c70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
29c80 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
29c90 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
29ca0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
29cb0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
29cc0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
29cd0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
29ce0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
29cf0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
29d00 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
29d10 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
29d20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
29d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29d40 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
29d50 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
29d60 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
29d70 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
29d80 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
29d90 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
29da0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
29db0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
29dc0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
29dd0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
29de0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
29df0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
29e00 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
29e10 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
29e20 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
29e30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
29e40 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
29e50 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
29e60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29e70 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
29e80 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
29e90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29eb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
29ec0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
29ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
29ee0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
29ef0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29f10 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
29f30 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
29f40 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
29f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29f70 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29fa0 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
29fb0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
29fc0 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
29fd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
29fe0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29ff0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2a000 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2a010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a020 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a030 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2a040 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a050 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
2a060 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
2a070 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
2a080 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
2a090 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
2a0a0 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
2a0b0 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
2a0c0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
2a0d0 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
2a0e0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
2a0f0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
2a100 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
2a110 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
2a120 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
2a130 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
2a140 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
2a150 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
2a160 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
2a170 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
2a180 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2a190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a1a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2a1b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a1c0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
2a1d0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2a1e0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
2a1f0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
2a200 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
2a210 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
2a220 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
2a230 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
2a240 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
2a250 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
2a260 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
2a270 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2a280 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2a290 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2a2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2a2b0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2a2c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a2d0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
2a2e0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
2a2f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
2a300 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
2a310 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
2a320 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2a330 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
2a340 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2a350 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
2a360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a380 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
2a390 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
2a3a0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
2a3b0 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
2a3c0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2a3d0 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
2a3e0 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
2a3f0 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
2a400 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
2a410 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2a420 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
2a430 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
2a440 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a450 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
2a460 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
2a470 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a480 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
2a490 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
2a4a0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
2a4b0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
2a4c0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
2a4d0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
2a4e0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
2a4f0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
2a500 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
2a510 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
2a520 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
2a530 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2a540 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
2a550 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
2a560 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
2a570 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
2a580 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
2a590 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
2a5a0 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
2a5b0 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
2a5c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
2a5d0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
2a5e0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
2a5f0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
2a600 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
2a610 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
2a620 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
2a630 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
2a640 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
2a650 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
2a660 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
2a670 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
2a680 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
2a690 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
2a6a0 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
2a6b0 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
2a6c0 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
2a6d0 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
2a6e0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
2a6f0 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
2a700 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2a710 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2a720 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
2a730 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2a740 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
2a750 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
2a760 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a770 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
2a780 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
2a790 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
2a7a0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
2a7b0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
2a7c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2a7d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
2a7e0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
2a7f0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
2a800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2a810 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
2a820 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
2a830 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
2a840 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d  g);.#endif.  }.}
2a850 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2a860 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
2a870 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
2a880 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
2a890 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63  abase file .** c
2a8a0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73  hange-counter, s
2a8b0 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74  tored as a 4-byt
2a8c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2a8d0 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74  eger starting at
2a8e0 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74   .** byte offset
2a8f0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
2a900 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2a910 74 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61  the isDirect fla
2a920 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
2a930 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
2a940 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
2a950 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2a960 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
2a970 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
2a980 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
2a990 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
2a9a0 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
2a9b0 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
2a9c0 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
2a9d0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2a9e0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
2a9f0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
2aa00 63 74 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  ct flag may only
2aa10 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
2aa20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
2aa30 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
2aa40 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
2aa50 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
2aa60 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
2aa70 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
2aa80 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
2aa90 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
2aaa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2aab0 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
2aac0 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
2aad0 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
2aae0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
2aaf0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
2ab00 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
2ab10 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
2ab20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ab30 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2ab40 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
2ab50 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
2ab60 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
2ab70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ab80 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
2ab90 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
2aba0 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
2abb0 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
2abc0 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
2abd0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2abe0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
2abf0 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
2ac00 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
2ac10 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2ac20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
2ac30 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
2ac40 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
2ac50 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
2ac60 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
2ac70 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
2ac80 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
2ac90 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
2aca0 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
2acb0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2acc0 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
2acd0 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
2ace0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
2acf0 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
2ad00 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
2ad10 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
2ad20 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
2ad30 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
2ad40 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
2ad50 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
2ad60 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
2ad70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ad80 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2ad90 49 54 45 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ITE.  const int 
2ada0 69 73 44 69 72 65 63 74 20 3d 20 30 3b 0a 20 20  isDirect = 0;.  
2adb0 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
2adc0 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  Mode==0 );.  UNU
2add0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
2ade0 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c  DirectMode);.#el
2adf0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
2ae00 73 44 69 72 65 63 74 20 3d 20 69 73 44 69 72 65  sDirect = isDire
2ae10 63 74 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a  ctMode;.#endif..
2ae20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ae30 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
2ae40 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
2ae50 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
2ae60 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61  CountDone && pPa
2ae70 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
2ae80 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
2ae90 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
2aea0 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
2aeb0 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20  to page 1 */.   
2aec0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
2aed0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
2aee0 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
2aef0 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  of change-counte
2af00 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20  r field */..    
2af10 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2af20 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f  >tempFile && isO
2af30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2af40 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
2af50 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
2af60 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
2af70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2af80 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2af90 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
2afa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
2afb0 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Hdr==0 || rc==SQ
2afc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
2afd0 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77  /* If page one w
2afe0 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65  as fetched succe
2aff0 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69  ssfully, and thi
2b000 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
2b010 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  t.    ** operati
2b020 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64  ng in direct-mod
2b030 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77  e, make page 1 w
2b040 72 69 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ritable..    */.
2b050 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b060 54 45 5f 4f 4b 20 26 26 20 21 69 73 44 69 72 65  TE_OK && !isDire
2b070 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
2b080 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b090 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
2b0a0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
2b0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b0c0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2b0d0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
2b0e0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
2b0f0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
2b100 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65   */.      change
2b110 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
2b120 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
2b130 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2b140 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  rs);.      chang
2b150 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
2b160 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
2b170 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
2b180 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
2b190 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20  ounter);..      
2b1a0 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
2b1b0 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
2b1c0 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2b1d0 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
2b1e0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
2b1f0 20 69 66 28 20 69 73 44 69 72 65 63 74 20 29 7b   if( isDirect ){
2b200 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
2b210 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48  oid *zBuf = pPgH
2b220 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  dr->pData;.     
2b230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b240 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
2b250 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2b260 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2b270 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
2b280 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2b290 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  e, 0);.      }..
2b2a0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 76 65 72        /* If ever
2b2b0 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 73  ything worked, s
2b2c0 65 74 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  et the changeCou
2b2d0 6e 74 44 6f 6e 65 20 66 6c 61 67 2e 20 2a 2f 0a  ntDone flag. */.
2b2e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b300 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2b310 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2b320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2b330 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2b340 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
2b350 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2b360 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
2b370 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2b380 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2b390 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
2b3a0 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20  e to disk. This 
2b3b0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69  is a no-op for i
2b3c0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a  n-memory files.*
2b3d0 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
2b3e0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
2b3f0 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
2b400 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2b410 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  or called on a p
2b420 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
2b430 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
2b440 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
2b450 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2b460 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
2b470 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2b480 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2b490 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
2b4a0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2b4b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2b4e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
2b4f0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
2b500 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2b510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2b530 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2b540 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2b550 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2b560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2b580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b590 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
2b5a0 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
2b5b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2b5c0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
2b5d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
2b5e0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
2b5f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2b600 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
2b610 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
2b620 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
2b630 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
2b640 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
2b650 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
2b660 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2b670 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
2b680 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b690 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
2b6a0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
2b6b0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2b6c0 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
2b6d0 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
2b6e0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
2b6f0 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
2b700 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2b710 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
2b720 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
2b730 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
2b740 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
2b750 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
2b760 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2b770 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
2b780 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
2b790 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
2b7a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b7b0 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
2b7c0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
2b7d0 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
2b7e0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
2b7f0 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
2b800 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
2b810 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
2b820 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
2b830 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
2b840 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
2b850 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
2b860 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b870 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
2b880 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
2b890 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
2b8a0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
2b8b0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
2b8c0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
2b8d0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
2b8e0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
2b8f0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
2b900 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
2b910 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
2b920 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
2b930 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b940 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
2b950 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
2b960 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
2b970 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2b980 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
2b990 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
2b9a0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
2b9b0 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
2b9c0 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
2b9d0 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
2b9e0 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
2b9f0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
2ba00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2ba10 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
2ba20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
2ba30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ba40 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
2ba50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
2ba60 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2ba70 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
2ba80 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2ba90 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
2baa0 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bac0 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
2bad0 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
2bae0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2baf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2bb20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
2bb30 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
2bb40 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2bb50 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ode;.  }..  PAGE
2bb60 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53  RTRACE(("DATABAS
2bb70 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
2bb80 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65  zMaster=%s nSize
2bb90 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
2bba0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2bbb0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
2bbc0 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20  r->dbSize));..  
2bbd0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2bbe0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
2bbf0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
2bc00 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
2bc10 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
2bc20 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
2bc30 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
2bc40 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
2bc50 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
2bc60 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2bc70 69 66 69 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ified ){.    sql
2bc80 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
2bc90 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
2bca0 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  p);.  }else if( 
2bcb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
2bcc0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70  AGER_SYNCED && p
2bcd0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2bce0 64 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  d ){..    /* The
2bcf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
2bd00 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
2bd10 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61  nge-counter. Exa
2bd20 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20  ctly how it.    
2bd30 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70  ** does this dep
2bd40 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
2bd50 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
2bd60 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2bd70 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73  ation.    ** was
2bd80 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
2bd90 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66  ile time, and if
2bda0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2bdb0 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20  n meets the .   
2bdc0 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74   ** runtime crit
2bdd0 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20  eria to use the 
2bde0 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20  operation: .    
2bdf0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  **.    **    * T
2be00 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2be10 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
2be20 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
2be30 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
2be40 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
2be50 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
2be60 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69  .    **    * Thi
2be70 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
2be80 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
2be90 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
2bea0 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
2beb0 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  * Exactly one pa
2bec0 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
2bed0 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
2bee0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2bef0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2bf00 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
2bf10 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e  ation was not en
2bf20 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2bf30 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a   time, then the.
2bf40 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
2bf50 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2bf60 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  ) function is ca
2bf70 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  lled to update t
2bf80 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  he change.    **
2bf90 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
2bfa0 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
2bfb0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2bfc0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2bfd0 62 75 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  but.    ** is no
2bfe0 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20  t applicable to 
2bff0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2c000 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f  , call sqlite3Jo
2c010 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20  urnalCreate().  
2c020 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
2c030 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2c040 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
2c050 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
2c060 65 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70  en call.    ** p
2c070 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2c080 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
2c090 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
2c0a0 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
2c0b0 63 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  ct.    ** mode. 
2c0c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
2c0d0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
2c0e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2c0f0 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e   both enabled an
2c100 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20  d applicable,.  
2c110 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70    ** then call p
2c120 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2c130 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
2c140 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
2c150 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e  ounter.    ** in
2c160 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
2c170 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2c180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
2c190 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
2c1a0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
2c1b0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
2c1c0 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
2c1d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2c1e0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 50 67  MIC_WRITE.    Pg
2c1f0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
2c200 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2c210 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
2c220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c230 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2c240 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
2c250 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
2c260 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2c270 64 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  d) .     && pPag
2c280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
2c290 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
2c2a0 50 61 67 65 72 29 20 0a 20 20 20 20 20 26 26 20  Pager) .     && 
2c2b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
2c2c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2c2d0 7a 65 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28  ze.     && (0==(
2c2e0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
2c2f0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2c300 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
2c310 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
2c320 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
2c330 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
2c340 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
2c350 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65  ter via the dire
2c360 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e  ct-write method.
2c370 20 54 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   The .      ** f
2c380 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
2c390 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e  ll modify the in
2c3a0 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
2c3b0 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
2c3c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e   .      ** to in
2c3d0 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
2c3e0 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  d change counter
2c3f0 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
2c400 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2c410 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2c420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c430 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
2c440 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
2c450 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f     ** property o
2c460 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
2c470 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20  system, this is 
2c480 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  safe..      */. 
2c490 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c4a0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c4b0 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
2c4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2c4e0 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
2c4f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
2c500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c510 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c520 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2c530 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2c540 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2c550 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20   }.#else.    rc 
2c560 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2c570 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2c580 72 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  r, 0);.#endif.  
2c590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c5a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c5b0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c5c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2c5d0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
2c5e0 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
2c5f0 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
2c600 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
2c610 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
2c620 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
2c630 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
2c640 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2c650 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  nal.    ** file.
2c660 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
2c670 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
2c680 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a  cuum mode..    *
2c690 2a 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20  *.    ** Before 
2c6a0 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65  reading the page
2c6b0 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
2c6c0 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ers larger than 
2c6d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72  the .    ** curr
2c6e0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
2c6f0 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
2c700 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
2c710 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74  e value.    ** t
2c720 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74  hat it took at t
2c730 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2c740 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68  transaction. Oth
2c750 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20  erwise, the.    
2c760 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
2c770 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65  te3PagerGet() re
2c780 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65  turn zeroed page
2c790 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20  s instead of .  
2c7a0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74    ** reading dat
2c7b0 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
2c7c0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2c7d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c7e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c7f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2c800 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  dbSize<pPager->d
2c810 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20 26  bOrigSize.     &
2c820 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2c830 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2c840 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
2c850 20 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20    ){.      Pgno 
2c860 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c880 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2c890 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2c8a0 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53     const Pgno iS
2c8b0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
2c8c0 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20  GNO(pPager); /* 
2c8d0 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67  Pending lock pag
2c8e0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
2c8f0 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
2c900 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20  Pager->dbSize;  
2c910 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2c920 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a   image size */ .
2c930 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2c940 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2c950 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20  bOrigSize;.     
2c960 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31   for( i=dbSize+1
2c970 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ; i<=pPager->dbO
2c980 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  rigSize; i++ ){.
2c990 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
2c9a0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
2c9b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2c9c0 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
2c9d0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  p ){.          P
2c9e0 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20  gHdr *pPage;    
2c9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ca00 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
2ca10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ca20 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
2ca30 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
2ca40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ca50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2ca60 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2ca70 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2ca80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ca90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2caa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
2cab0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2cac0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2cad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cae0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2caf0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cb00 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
2cb10 20 20 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67     } .      pPag
2cb20 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53  er->dbSize = dbS
2cb30 69 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ize;.    }.#endi
2cb40 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
2cb50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
2cb60 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
2cb70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2cb80 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20  f a master .    
2cb90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2cba0 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
2cbb0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2cbc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cbd0 65 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  e, .    ** or if
2cbe0 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c   zMaster is NULL
2cbf0 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72   (no master jour
2cc00 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20  nal), then this 
2cc10 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
2cc20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2cc30 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
2cc40 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
2cc50 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
2cc60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2cc70 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2cc80 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2cc90 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2cca0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
2ccb0 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
2ccc0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65  timization is be
2ccd0 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c  ing.    ** used,
2cce0 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   this call will 
2ccf0 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a  not create the j
2cd00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70  ournal file or p
2cd10 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a  erform any.    *
2cd20 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a  * real IO..    *
2cd30 2f 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a  /.    rc = syncJ
2cd40 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2cd50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cd60 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2cd70 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2cd80 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  it;..    /* Writ
2cd90 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
2cda0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
2cdb0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  e file. */.    r
2cdc0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
2cdd0 70 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33  pagelist(sqlite3
2cde0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2cdf0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2ce00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ce10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ce20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2ce30 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
2ce40 45 44 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ED );.      goto
2ce50 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2ce60 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  e_exit;.    }.  
2ce70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
2ce80 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
2ce90 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f  pPCache);..    /
2cea0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
2ceb0 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65   disk is not the
2cec0 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68   same size as th
2ced0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2cee0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73  ,.    ** then us
2cef0 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e pager_truncate
2cf00 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69   to grow or shri
2cf10 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65  nk the file here
2cf20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2cf30 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21   pPager->dbSize!
2cf40 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
2cf50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ize ){.      Pgn
2cf60 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d  o nNew = pPager-
2cf70 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65  >dbSize - (pPage
2cf80 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52  r->dbSize==PAGER
2cf90 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2cfa0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2cfb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2cfc0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2cfd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2cfe0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
2cff0 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ger, nNew);.    
2d000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d010 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2d020 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2d030 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d040 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68  Finally, sync th
2d050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d060 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
2d070 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
2d080 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2d090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2d0a0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
2d0b0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
2d0c0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
2d0d0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
2d0e0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
2d0f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2d100 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
2d110 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68  ;.  }..commit_ph
2d120 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20  ase_one_exit:.  
2d130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2d140 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a  OERR_BLOCKED ){.
2d150 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63      /* pager_inc
2d160 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2d170 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f  ) may attempt to
2d180 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
2d190 73 69 76 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  sive.    ** lock
2d1a0 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61   to spill the ca
2d1b0 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  che and return I
2d1c0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75  OERR_BLOCKED. Bu
2d1d0 74 20 73 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20  t since .    ** 
2d1e0 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
2d1f0 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20  ce the cache is 
2d200 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74  inconsistent, it
2d210 20 69 73 0a 20 20 20 20 2a 2a 20 62 65 74 74 65   is.    ** bette
2d220 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  r to return SQLI
2d230 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f  TE_BUSY..    **/
2d240 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2d250 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74  _BUSY;.  }.  ret
2d260 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2d270 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
2d280 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2d290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d2a0 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  e has been compl
2d2b0 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64  etely.** updated
2d2c0 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
2d2d0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
2d2e0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2d2f0 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73  saction and.** s
2d300 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54  ynced to disk. T
2d310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d320 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20  still exists in 
2d330 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2d340 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  .** though, and 
2d350 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
2d360 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
2d370 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75  t it will eventu
2d380 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  ally.** be used 
2d390 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
2d3a0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
2d3b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
2d3c0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2d3d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
2d3e0 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
2d3f0 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72  nal file, either
2d400 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a   by deleting, .*
2d410 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20  * truncating or 
2d420 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e  partially zeroin
2d430 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74  g it, so that it
2d440 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
2d450 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72  .** for hot-jour
2d460 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e  nal rollback. On
2d470 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  ce this is done 
2d480 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2d490 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c  is.** irrevocabl
2d4a0 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  y committed..**.
2d4b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2d4c0 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
2d4d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2d4e0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
2d4f0 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20  r.** moves into 
2d500 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2d510 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
2d520 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2d530 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d540 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
2d550 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
2d560 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2d570 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2d590 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2d5a0 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65   /* Do not proce
2d5b0 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2d5c0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2d5d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  e error state. *
2d5e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2d5f0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
2d600 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2d610 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
2d620 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2d630 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2d640 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72  led if the pager
2d650 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65   is not in at le
2d660 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52  ast.  ** PAGER_R
2d670 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41  ESERVED state. A
2d680 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65  nd indeed SQLite
2d690 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73   never does this
2d6a0 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a  . But it is.  **
2d6b0 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68   nice to have th
2d6c0 69 73 20 64 65 66 65 6e 73 69 76 65 20 62 6c 6f  is defensive blo
2d6d0 63 6b 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a  ck here anyway..
2d6e0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2d6f0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50  (pPager->state<P
2d700 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29  AGER_RESERVED) )
2d710 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d720 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2d730 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61    /* An optimiza
2d740 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74  tion. If the dat
2d750 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63  abase was not ac
2d760 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20  tually modified 
2d770 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73  during.  ** this
2d780 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2d790 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
2d7a0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
2d7b0 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a  mode and is.  **
2d7c0 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e   using persisten
2d7d0 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
2d7e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d7f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
2d800 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f    ** The start o
2d810 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2d820 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
2d830 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a  tains a single j
2d840 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
2d850 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65  der with the nRe
2d860 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30  c field set to 0
2d870 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72  . If such a jour
2d880 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20  nal is used as. 
2d890 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
2d8a0 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  l during hot-jou
2d8b0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30  rnal rollback, 0
2d8c0 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65   changes will be
2d8d0 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68   made.  ** to th
2d8e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d8f0 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
2d900 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65  need to zero the
2d910 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
2d920 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65  eader. Since the
2d930 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
2d940 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2d950 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
2d960 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c  ** to drop any l
2d970 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a  ocks either..  *
2d980 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2d990 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26  dbModified==0 &&
2d9a0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2d9b0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50  veMode .   && pP
2d9c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2d9d0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2d9e0 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29  MODE_PERSIST.  )
2d9f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2da00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2da10 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
2da20 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2da30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2da40 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2da50 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE(("COMMIT %d\
2da60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2da70 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
2da80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2da90 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
2daa0 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72  MEMDB || !pPager
2dab0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2dac0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2dad0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2dae0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2daf0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
2db00 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2db10 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
2db20 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
2db30 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61   changes. The da
2db40 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
2db50 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
2db60 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  D mode..**.** Th
2db70 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
2db80 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a  orms two tasks:.
2db90 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f  **.**   1) It ro
2dba0 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75  lls back the jou
2dbb0 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f  rnal file, resto
2dbc0 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73  ring all databas
2dbd0 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20  e file and .**  
2dbe0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61      in-memory ca
2dbf0 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65  che pages to the
2dc00 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65   state they were
2dc10 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61   in when the tra
2dc20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2dc30 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64   was opened, and
2dc40 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61  .**   2) It fina
2dc50 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2dc60 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20  l file, so that 
2dc70 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66  it is not used f
2dc80 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72  or hot.**      r
2dc90 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70  ollback at any p
2dca0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2dcb0 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63  re..**.** subjec
2dcc0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
2dcd0 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ng qualification
2dce0 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68  s:.**.** * If th
2dcf0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2dd00 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77  s not yet open w
2dd10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2dd20 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
2dd30 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20    then only (2) 
2dd40 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e  is performed. In
2dd50 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2dd60 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66   is no journal f
2dd70 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c  ile.**   to roll
2dd80 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49   back..**.** * I
2dd90 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  f in an error st
2dda0 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
2ddb0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e  QLITE_FULL, then
2ddc0 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a   task (1) is .**
2ddd0 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66     performed. If
2dde0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73   successful, tas
2ddf0 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73  k (2). Regardles
2de00 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
2de10 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c  .**   of either,
2de20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2de30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2de40 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
2de50 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e  aller.**   (i.e.
2de60 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
2de70 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43  OERR or SQLITE_C
2de80 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a  ORRUPT)..**.** *
2de90 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2dea0 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56   in PAGER_RESERV
2deb0 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  ED state, then a
2dec0 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74  ttempt (1). Whet
2ded0 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20  her.**   or not 
2dee0 28 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75  (1) is succussfu
2def0 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20  l, also attempt 
2df00 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66  (2). If successf
2df10 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  ul, return.**   
2df20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2df30 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20  wise, enter the 
2df40 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2df50 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  return the first
2df60 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64   .**   error cod
2df70 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a  e encountered. .
2df80 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2df90 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2dfa0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
2dfb0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72   database was wr
2dfc0 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20  itten to. .**   
2dfd0 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69  So is safe to fi
2dfe0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
2dff0 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20  al file even if 
2e000 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a  the playback .**
2e010 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29     (operation 1)
2e020 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72   failed. However
2e030 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   the pager must 
2e040 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2e050 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68  state.**   as th
2e060 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e070 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2e080 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63  e are now suspec
2e090 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c  t..**.** * Final
2e0a0 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f  ly, if in PAGER_
2e0b0 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
2e0c0 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2e0d0 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74  ). Only.**   att
2e0e0 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20  empt (2) if (1) 
2e0f0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52  is successful. R
2e100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2e110 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  if successful,.*
2e120 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e  *   otherwise en
2e130 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2e140 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2e150 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  he error code fr
2e160 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69  om the .**   fai
2e170 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  ling operation..
2e180 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2e190 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73  case the databas
2e1a0 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20  e file may have 
2e1b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e  been written to.
2e1c0 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20   So if the.**   
2e1d0 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69  playback operati
2e1e0 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65  on did not succe
2e1f0 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20  ed it would not 
2e200 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  be safe to final
2e210 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75  ize.**   the jou
2e220 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65  rnal file. It ne
2e230 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69  eds to be left i
2e240 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2e250 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73  m so that.**   s
2e260 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
2e270 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20  s can use it to 
2e280 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
2e290 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a  base state (by.*
2e2a0 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  *   hot-journal 
2e2b0 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e  rollback)..*/.in
2e2c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
2e2d0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
2e2e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2e2f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e310 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2e320 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52    PAGERTRACE(("R
2e330 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
2e340 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2e350 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2e360 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21  >dbModified || !
2e370 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2e380 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
2e390 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2e3a0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2e3b0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2e3c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
2e3d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
2e3e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e3f0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
2e400 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2e410 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2e420 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
2e430 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e440 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e450 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
2e460 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
2e470 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2e480 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
2e490 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
2e4a0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
2e4b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
2e4c0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2e4d0 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
2e4e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2e4f0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2e500 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2e510 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e530 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
2e540 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e550 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2e560 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2e570 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
2e580 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2e590 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2e5a0 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
2e5b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e5c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2e5d0 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
2e5e0 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
2e5f0 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
2e600 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
2e610 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
2e620 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
2e630 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
2e640 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
2e650 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
2e660 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
2e670 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2e680 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
2e690 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e6a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2e6b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e6c0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
2e6d0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
2e6e0 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
2e6f0 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
2e700 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
2e710 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
2e720 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
2e730 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e740 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
2e750 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
2e760 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2e770 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2e780 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
2e790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e7a0 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
2e7b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e7c0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2e7d0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2e7e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
2e7f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2e800 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2e810 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
2e820 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
2e830 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
2e840 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
2e850 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
2e860 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
2e870 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
2e880 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
2e890 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2e8a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e8b0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
2e8c0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
2e8d0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
2e8e0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
2e8f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e900 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
2e910 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
2e920 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
2e930 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2e940 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
2e950 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2e960 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2e970 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
2e980 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
2e990 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
2e9a0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2e9b0 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
2e9c0 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74  SizeValid ? (int
2e9d0 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ) pPager->dbSize
2e9e0 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20   : -1;.  a[4] = 
2e9f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
2ea00 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
2ea10 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
2ea20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
2ea30 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
2ea40 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
2ea50 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
2ea60 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
2ea70 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
2ea80 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
2ea90 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
2eaa0 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
2eab0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2eac0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2ead0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2eae0 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a  emory pager..*/.
2eaf0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2eb00 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70  IsMemdb(Pager *p
2eb10 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2eb20 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   MEMDB;.}../*.**
2eb30 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   Check that ther
2eb40 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e  e are at least n
2eb50 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f  Savepoint savepo
2eb60 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68  ints open. If th
2eb70 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  ere are.** curre
2eb80 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e  ntly less than n
2eb90 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c  Savepoints open,
2eba0 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f   then open one o
2ebb0 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
2ebc0 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20  s.** to make up 
2ebd0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20  the difference. 
2ebe0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
2ebf0 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61   savepoints is a
2ec00 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20  lready.** equal 
2ec10 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74  to nSavepoint, t
2ec20 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2ec30 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2ec40 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
2ec50 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2ec60 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
2ec70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2ec80 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
2ec90 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
2eca0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ecb0 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49   file, then an I
2ecc0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a  O error code is.
2ecd0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
2ece0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
2ecf0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
2ed00 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
2ed10 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2ed20 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  r, int nSavepoin
2ed30 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2ed40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ed70 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  /.  int nCurrent
2ed80 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   = pPager->nSave
2ed90 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  point;        /*
2eda0 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   Current number 
2edb0 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  of savepoints */
2edc0 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69  ..  if( nSavepoi
2edd0 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70  nt>nCurrent && p
2ede0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2edf0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  l ){.    int ii;
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2ee30 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67  iable */.    Pag
2ee40 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65  erSavepoint *aNe
2ee50 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2ee60 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65       /* New Page
2ee70 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2ee80 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69  ay */..    /* Ei
2ee90 74 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f  ther there is no
2eea0 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20   active journal 
2eeb0 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  or the sub-journ
2eec0 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20  al is open or . 
2eed0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2eee0 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72  l is always stor
2eef0 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ed in memory */.
2ef00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ef10 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2ef20 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  0 || isOpen(pPag
2ef30 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20  er->sjfd) ||.   
2ef40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2ef50 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2ef60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ef70 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f  MEMORY );..    /
2ef80 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
2ef90 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2efa0 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
2efb0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
2efc0 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
2efd0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2efe0 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
2eff0 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
2f000 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
2f010 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
2f020 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
2f030 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
2f040 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
2f050 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
2f060 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
2f070 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
2f080 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
2f090 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
2f0a0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
2f0b0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
2f0c0 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
2f0d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2f0e0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
2f0f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f100 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
2f110 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
2f120 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
2f130 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
2f140 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2f150 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
2f160 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2f170 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61   = aNew;.    pPa
2f180 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2f190 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
2f1a0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2f1b0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
2f1c0 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
2f1d0 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
2f1e0 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
2f1f0 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
2f200 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2f210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f220 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
2f230 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e        aNew[ii].n
2f240 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64  Orig = pPager->d
2f250 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  bSize;.      if(
2f260 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f270 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
2f280 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a  journalOff>0 ){.
2f290 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2f2a0 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
2f2b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2f2c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f2d0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
2f2e0 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
2f2f0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
2f300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
2f310 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
2f320 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
2f330 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2f340 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
2f350 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2f360 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
2f370 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  e);.      if( !a
2f380 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2f390 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
2f3a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f3b0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2f3c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   }..    /* Open 
2f3d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2f3e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
2f3f0 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  ready opened. */
2f400 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2f410 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2f420 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2f430 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f440 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f450 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
2f460 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
2f470 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
2f480 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
2f490 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
2f4a0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
2f4b0 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
2f4c0 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
2f4d0 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
2f4e0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
2f4f0 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
2f500 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
2f510 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
2f520 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
2f530 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2f540 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
2f550 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
2f560 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
2f570 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
2f580 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
2f590 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2f5a0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
2f5b0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
2f5c0 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
2f5d0 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
2f5e0 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
2f5f0 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
2f600 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
2f610 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
2f620 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
2f630 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2f640 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
2f650 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
2f660 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
2f670 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
2f680 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
2f690 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
2f6a0 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
2f6b0 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
2f6c0 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
2f6d0 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
2f6e0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2f6f0 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2f700 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
2f710 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
2f720 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
2f730 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
2f740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f750 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2f760 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
2f770 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
2f780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2f790 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
2f7a0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2f7b0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
2f7c0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
2f7d0 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
2f7e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2f7f0 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
2f800 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2f810 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
2f820 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
2f830 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
2f840 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
2f850 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
2f860 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
2f870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2f880 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
2f890 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
2f8a0 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
2f8b0 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
2f8c0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
2f8d0 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
2f8e0 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
2f8f0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2f900 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
2f910 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
2f920 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
2f930 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
2f940 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
2f950 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
2f960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2f970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2f980 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
2f990 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2f9a0 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
2f9b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2f9c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2f9d0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
2f9e0 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
2f9f0 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
2fa00 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
2fa10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
2fa20 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
2fa30 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
2fa40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2fa50 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
2fa60 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2fa70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2fa80 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
2fa90 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
2faa0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2fab0 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
2fac0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2fad0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2fae0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
2faf0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
2fb00 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2fb10 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
2fb20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fb30 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2fb40 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
2fb50 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
2fb60 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
2fb70 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
2fb80 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
2fb90 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
2fba0 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
2fbb0 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
2fbc0 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
2fbd0 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
2fbe0 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
2fbf0 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
2fc00 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
2fc10 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
2fc20 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
2fc30 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
2fc40 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
2fc50 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
2fc60 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
2fc70 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
2fc80 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   + (op==SAVEPOIN
2fc90 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
2fca0 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69   for(ii=nNew; ii
2fcb0 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2fcc0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2fcd0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2fce0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
2fcf0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
2fd00 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
2fd10 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
2fd20 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77  Savepoint = nNew
2fd30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2fd40 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
2fd50 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62  operation, playb
2fd60 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65  ack the specifie
2fd70 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20  d savepoint..   
2fd80 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
2fd90 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69   temp-file, it i
2fda0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
2fdb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fdc0 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
2fdd0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
2fde0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2fdf0 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2fe00 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20   changes to.    
2fe10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2fe20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61  file, so the pla
2fe30 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2fe40 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
2fe50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
2fe60 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2fe70 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28  LBACK && isOpen(
2fe80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2fe90 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
2fea0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
2feb0 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
2fec0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2fed0 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
2fee0 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
2fef0 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
2ff00 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
2ff10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ff20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
2ff30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2ff40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
2ff50 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
2ff60 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2ff70 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
2ff80 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
2ff90 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
2ffa0 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
2ffb0 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26    if( nNew==0 &&
2ffc0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2ffd0 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e  ELEASE && isOpen
2ffe0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2fff0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
30010 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30020 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
30030 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
30040 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
30050 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d  ubRec = 0;.    }
30060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30080 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
30090 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
300a0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
300b0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
300c0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
300d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
300e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
300f0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
30100 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
30110 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
30120 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
30130 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
30140 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
30150 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30160 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30170 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
30180 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
30190 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
301a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
301b0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
301c0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
301d0 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
301e0 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
301f0 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
30200 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
30210 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
30220 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
30230 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30240 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
30250 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
30260 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
30270 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
30280 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
30290 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
302a0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
302b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
302c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
302d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
302e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
302f0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
30300 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
30310 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
30320 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
30330 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
30340 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
30350 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
30360 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
30370 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
30380 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
30390 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
303a0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
303b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65  ./*.** Set or re
303c0 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63  trieve the codec
303d0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
303e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
303f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
30400 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
30410 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
30420 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
30430 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
30440 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
30450 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
30460 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28  t,int),.  void (
30470 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
30480 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  d*),.  void *pCo
30490 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61  dec.){.  if( pPa
304a0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
304b0 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
304c0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
304d0 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dec);.  pPager->
304e0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
304f0 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
30500 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64  cSizeChng = xCod
30510 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50  ecSizeChng;.  pP
30520 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
30530 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20   = xCodecFree;. 
30540 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20   pPager->pCodec 
30550 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65  = pCodec;.  page
30560 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
30570 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  er);.}.static vo
30580 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
30590 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a  GetCodec(Pager *
305a0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
305b0 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  n pPager->pCodec
305c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
305d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
305e0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
305f0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
30600 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
30610 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
30620 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
30630 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
30640 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
30650 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
30660 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
30670 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
30680 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
30690 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
306a0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
306b0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
306c0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
306d0 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
306e0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
306f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30700 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
30710 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
30720 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
30730 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
30740 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
30750 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
30760 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
30770 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
30780 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
30790 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
307a0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
307b0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
307c0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
307d0 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
307e0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
307f0 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
30800 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
30810 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
30820 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
30830 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
30840 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
30850 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
30860 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
30870 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
30880 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
30890 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
308a0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
308b0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
308c0 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
308d0 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
308e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
308f0 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
30900 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
30910 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
30920 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
30930 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
30940 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
30950 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
30960 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
30970 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
30980 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
30990 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
309a0 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
309b0 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
309c0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
309d0 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
309e0 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
309f0 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
30a00 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
30a10 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
30a20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
30a30 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
30a40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
30a50 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
30a60 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
30a70 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72  ** occurs. Other
30a80 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73  wise, it returns
30a90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
30aa0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
30ab0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
30ac0 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
30ad0 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
30ae0 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
30af0 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b10 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
30b20 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
30b30 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
30b40 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  no = 0;       /*
30b50 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50   Old value of pP
30b60 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63  g->pgno, if sync
30b70 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
30b80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ba0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30bb0 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f  .  Pgno origPgno
30bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30bd0 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
30be0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  page number */..
30bf0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
30c00 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  Ref>0 );..  /* I
30c10 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
30c20 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20   moved is dirty 
30c30 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  and has not been
30c40 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61   saved by the la
30c50 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f  test.  ** savepo
30c60 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74  int, then save t
30c70 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
30c80 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30c90 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
30ca0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20  ub-journal now. 
30cb0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
30cc0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66   to handle the f
30cd0 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
30ce0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42  o:.  **.  **   B
30cf0 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c  EGIN;.  **     <
30d00 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20  journal page X, 
30d10 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69  then modify it i
30d20 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20  n memory>.  **  
30d30 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
30d40 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f  ;.  **       <Mo
30d50 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63  ve page X to loc
30d60 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20  ation Y>.  **   
30d70 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
30d80 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e;.  **.  ** If 
30d90 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20  page X were not 
30da0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
30db0 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c  ub-journal here,
30dc0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20   it would not.  
30dd0 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
30de0 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f  o restore its co
30df0 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20  ntents when the 
30e00 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65  "ROLLBACK TO one
30e10 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ".  ** statement
30e20 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73   were is process
30e30 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75  ed..  **.  ** su
30e40 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d  bjournalPage() m
30e50 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63  ay need to alloc
30e60 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f  ate space to sto
30e70 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74  re pPg->pgno int
30e80 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  o.  ** one or mo
30e90 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74  re savepoint bit
30ea0 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68  vecs. This is th
30eb0 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75  e reason this fu
30ec0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20  nction.  ** may 
30ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30ee0 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MEM..  */.  if( 
30ef0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
30f00 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73 75  _DIRTY .   && su
30f10 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
30f20 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
30f30 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
30f40 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
30f50 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
30f60 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
30f70 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
30f80 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
30f90 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
30fa0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
30fb0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
30fc0 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
30fd0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
30fe0 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
30ff0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
31000 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
31010 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
31020 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a  no, pgno))..  /*
31030 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
31040 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
31050 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
31060 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
31070 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
31080 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
31090 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
310a0 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
310b0 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
310c0 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
310d0 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
310e0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
310f0 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
31100 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
31110 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
31120 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
31130 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
31140 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
31150 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
31160 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
31170 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
31180 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
31190 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
311a0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
311b0 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
311c0 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
311d0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
311e0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
311f0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
31200 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
31210 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31220 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
31230 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
31240 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
31250 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31260 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
31270 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
31280 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
31290 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
312a0 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
312b0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
312c0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
312d0 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
312e0 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
312f0 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
31300 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
31310 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
31320 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
31330 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
31340 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
31350 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
31360 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
31370 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
31380 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
31390 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
313a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
313b0 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
313c0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
313d0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
313e0 67 4f 6c 64 29 20 29 7b 0a 20 20 20 20 70 50 67  gOld) ){.    pPg
313f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
31400 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
31410 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
31420 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
31430 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a  p(pPgOld);.  }..
31440 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67    origPgno = pPg
31450 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65  ->pgno;.  sqlite
31460 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
31470 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
31480 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
31490 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
314a0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
314b0 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
314c0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
314d0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
314e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
314f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31500 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
31510 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
31520 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
31530 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
31540 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
31550 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
31560 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
31570 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
31580 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
31590 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
315a0 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
315b0 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
315c0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
315d0 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
315e0 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
315f0 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
31600 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
31610 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
31620 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
31630 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
31640 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
31650 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
31660 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
31670 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
31680 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
31690 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
316a0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
316b0 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
316c0 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
316d0 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
316e0 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
316f0 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
31700 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
31710 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
31720 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
31730 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
31740 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
31750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
31760 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
31770 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
31780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
31790 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
317a0 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
317b0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
317c0 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
317d0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
317e0 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
317f0 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
31800 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
31810 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
31820 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
31830 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
31840 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
31850 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
31860 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
31870 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
31880 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31890 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
318a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
318b0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
318c0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
318d0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
318e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
318f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
31900 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
31910 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
31920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31930 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
31940 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  e!=0 );.        
31950 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65  sqlite3BitvecCle
31960 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ar(pPager->pInJo
31970 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50  urnal, needSyncP
31980 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d  gno, pPager->pTm
31990 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  pSpace);.      }
319a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
319b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
319c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
319d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
319e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
319f0 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
31a00 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
31a10 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
31a20 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  C;.    sqlite3Pc
31a30 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
31a40 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
31a50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
31a60 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  Hdr);.  }..  /*.
31a70 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d    ** For an in-m
31a80 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
31a90 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  make sure the or
31aa0 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
31ab0 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78  inues.  ** to ex
31ac0 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ist, in case the
31ad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
31ae0 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  ds to roll back.
31af0 20 20 57 65 20 61 6c 6c 6f 63 61 74 65 0a 20 20    We allocate.  
31b00 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 6f 77 2c  ** the page now,
31b10 20 69 6e 73 74 65 61 64 20 6f 66 20 61 74 20 72   instead of at r
31b20 6f 6c 6c 62 61 63 6b 2c 20 62 65 63 61 75 73 65  ollback, because
31b30 20 77 65 20 63 61 6e 20 62 65 74 74 65 72 20 64   we can better d
31b40 65 61 6c 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  eal.  ** with an
31b50 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
31b60 72 72 6f 72 20 6e 6f 77 2e 20 20 54 69 63 6b 65  rror now.  Ticke
31b70 74 20 23 33 37 36 31 2e 0a 20 20 2a 2f 0a 20 20  t #3761..  */.  
31b80 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
31b90 20 44 62 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20   DbPage *pNew;. 
31ba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31bb0 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
31bc0 65 72 2c 20 6f 72 69 67 50 67 6e 6f 2c 20 26 70  er, origPgno, &p
31bd0 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  New, 1);.    if(
31be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31bf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
31c00 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 6f  cacheMove(pPg, o
31c10 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  rigPgno);.      
31c20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
31c30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31c40 72 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20 20  rUnref(pNew);.  
31c50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31c60 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
31c70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
31c80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
31c90 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
31ca0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
31cb0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
31cc0 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
31cd0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
31ce0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20   pPg->nRef>0 || 
31cf0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
31d00 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Db );.  return p
31d10 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  Pg->pData;.}../*
31d20 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
31d30 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
31d40 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
31d50 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
31d60 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
31d70 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
31d80 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
31d90 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
31da0 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
31db0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
31dc0 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d  n pPg->pExtra;.}
31dd0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
31de0 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
31df0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
31e00 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
31e10 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
31e20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
31e30 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
31e40 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
31e50 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
31e60 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
31e70 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
31e80 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
31e90 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
31ea0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
31eb0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
31ec0 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
31ed0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
31ee0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
31ef0 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
31f00 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
31f10 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
31f20 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
31f30 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
31f40 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
31f50 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
31f60 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
31f70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
31f80 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
31f90 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
31fa0 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
31fb0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
31fc0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
31fd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
31fe0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
31ff0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
32000 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32010 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
32020 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
32030 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
32040 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
32050 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
32060 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
32070 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
32080 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
32090 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
320a0 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
320b0 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
320c0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
320d0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
320e0 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
320f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
32100 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
32110 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  usiveMode;.}../*
32120 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
32130 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72  journal-mode for
32140 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
32150 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
32160 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  t be one of:.**.
32170 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
32180 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a  NALMODE_QUERY.**
32190 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
321a0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  LMODE_DELETE.** 
321b0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
321c0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a  MODE_TRUNCATE.**
321d0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
321e0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a  LMODE_PERSIST.**
321f0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
32200 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20  LMODE_OFF.**    
32210 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32220 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49  E_MEMORY.**.** I
32230 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
32240 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
32250 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f  hen the journal_
32260 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
32270 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63  he.** value spec
32280 69 66 69 65 64 20 69 66 20 74 68 65 20 63 68 61  ified if the cha
32290 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20  nge is allowed. 
322a0 20 54 68 65 20 63 68 61 6e 67 65 20 69 73 20 64   The change is d
322b0 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72  isallowed.** for
322c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
322d0 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  easons:.**.**   
322e0 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  *  An in-memory 
322f0 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c  database can onl
32300 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e  y have its journ
32310 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f  al_mode set to _
32320 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f  OFF.**      or _
32330 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20  MEMORY..**.**   
32340 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  *  The journal m
32350 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  ode may not be c
32360 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74  hanged while a t
32370 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
32380 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tive..**.** The 
32390 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74  returned indicat
323a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  e the current (p
323b0 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
323c0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a   journal-mode..*
323d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
323e0 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  erJournalMode(Pa
323f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
32400 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
32410 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
32420 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
32430 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
32440 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
32450 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
32460 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
32470 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
32480 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
32490 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
324a0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
324b0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
324c0 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  T.            ||
324d0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
324e0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
324f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
32500 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32510 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
32520 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
32530 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
32540 52 59 3c 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  RY<0 );.  if( eM
32550 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d  ode>=0.   && (!M
32560 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50  EMDB || eMode==P
32570 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32580 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
32590 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
325a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
325b0 44 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21 70  DE_OFF).   && !p
325c0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
325d0 64 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65 6e  d.   && (!isOpen
325e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
325f0 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72   0==pPager->jour
32600 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20  nalOff).  ){.   
32610 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
32620 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
32630 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
32640 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
32650 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
32660 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28  >journalMode = (
32670 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
32680 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
32690 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b  er->journalMode;
326a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
326b0 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74  t the size-limit
326c0 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73   used for persis
326d0 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
326e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e  es..**.** Settin
326f0 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74  g the size limit
32700 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20   to -1 means no 
32710 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65  limit is enforce
32720 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74  d..** An attempt
32730 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20   to set a limit 
32740 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20  smaller than -1 
32750 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
32760 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  64 sqlite3PagerJ
32770 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28  ournalSizeLimit(
32780 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
32790 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66  64 iLimit){.  if
327a0 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a  ( iLimit>=-1 ){.
327b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
327c0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69  nalSizeLimit = i
327d0 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
327e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  urn pPager->jour
327f0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a  nalSizeLimit;.}.
32800 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
32810 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
32820 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76  Pager->pBackup v
32830 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63  ariable. The bac
32840 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e  kup module.** in
32850 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61   backup.c mainta
32860 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ins the content 
32870 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  of this variable
32880 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a  . This module.**
32890 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c   uses it opaquel
328a0 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  y as an argument
328b0 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75   to sqlite3Backu
328c0 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a  pRestart() and.*
328d0 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55  * sqlite3BackupU
328e0 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f  pdate() only..*/
328f0 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20  .sqlite3_backup 
32900 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42 61  **sqlite3PagerBa
32910 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a 70  ckupPtr(Pager *p
32920 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
32930 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   &pPager->pBacku
32940 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  p;.}..#endif /* 
32950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
32960 49 4f 20 2a 2f 0a                                IO */.