/ Hex Artifact Content
Login

Artifact 85cb38f0403881f827c30384c51a7a6e54c6d457:


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 30  : pager.c,v 1.60
0350: 31 20 32 30 30 39 2f 30 36 2f 32 32 20 30 35 3a  1 2009/06/22 05:
0360: 34 33 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37  43: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 20 20 6d 65 6d 63 70 79  Pager);.  memcpy
7690: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
76a0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
76b0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
76c0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
76d0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
76e0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
76f0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7700: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7710: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
7720: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
7730: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
7740: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
7750: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
7760: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
7770: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7780: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
77a0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
77b0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
77c0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
77d0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
77e0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
77f0: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7800: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7810: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
7820: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
7830: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
7840: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
7850: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
7860: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
7870: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7880: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7890: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
78a0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
78b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
78c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
78d0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
78e0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
78f0: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7900: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7910: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
7920: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
7930: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
7940: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
7950: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
7960: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
7970: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7980: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7990: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
79a0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
79b0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
79c0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
79d0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
79e0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
79f0: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7a00: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7a10: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
7a20: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
7a30: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
7a40: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
7a50: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
7a60: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
7a70: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a80: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a90: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7aa0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7ab0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7ac0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7ad0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7ae0: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7af0: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7b00: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7b10: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7b20: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7b30: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7b40: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7b50: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7b60: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7b70: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
7b80: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7b90: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7ba0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
7bb0: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
7bc0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
7bd0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7be0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
7bf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
7c00: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
7c10: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
7c20: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
7c30: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
7c40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7c50: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
7c60: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
7c70: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7c80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7c90: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
7ca0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
7cb0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
7cc0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
7cd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7ce0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7cf0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
7d00: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
7d10: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
7d20: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
7d30: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
7d40: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
7d50: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7d60: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
7d70: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7d80: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
7d90: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
7da0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7db0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7dc0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
7dd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7de0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
7df0: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
7e00: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
7e10: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
7e20: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
7e30: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
7e40: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
7e50: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
7e60: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
7e70: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
7e80: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
7e90: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
7ea0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
7eb0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
7ec0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
7ed0: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
7ee0: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
7ef0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7f00: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
7f10: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
7f20: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7f30: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
7f40: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
7f50: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
7f60: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
7f70: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
7f80: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
7f90: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
7fa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7fb0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
7fc0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
7fd0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
7fe0: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
7ff0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
8000: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
8010: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
8020: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
8030: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
8040: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
8050: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
8060: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
8070: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
8080: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
8090: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
80a0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
80b0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
80c0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
80d0: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
80e0: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
80f0: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
8100: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
8110: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
8120: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
8130: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
8140: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
8150: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
8160: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
8170: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
8180: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
8190: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
81a0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
81b0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
81c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
81d0: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
81e0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
81f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
8200: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
8210: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
8220: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
8230: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
8240: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
8250: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
8260: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
8270: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
8280: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
8290: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
82a0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
82b0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
82c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
82d0: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
82e0: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
82f0: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
8300: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8310: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
8320: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
8330: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
8340: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
8350: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
8360: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
8370: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
8380: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
8390: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
83a0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
83b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
83c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
83d0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
83e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
83f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
8400: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
8410: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
8420: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
8430: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8440: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
8450: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
8460: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
8470: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8480: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
8490: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
84a0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
84b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
84c0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
84d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
84e0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
84f0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
8500: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
8510: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
8520: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
8530: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
8540: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
8550: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
8560: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
8570: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
8580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
8590: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
85a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
85b0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
85c0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
85d0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
85e0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
85f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
8600: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
8610: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
8620: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
8630: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
8640: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
8650: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
8660: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8670: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
8680: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
8690: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
86a0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
86b0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
86c0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
86d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
86e0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
86f0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
8700: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
8710: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
8720: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
8730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8740: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
8750: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
8760: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
8770: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
8780: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
8790: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
87a0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
87b0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
87c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
87d0: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
87e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
87f0: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
8800: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
8810: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
8820: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
8830: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
8840: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
8870: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
8880: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
8890: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
88c0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
88d0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
88e0: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
88f0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
8900: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
8910: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
8920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8930: 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
8940: 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
8950: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
8960: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8970: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8990: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
89a0: 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
89b0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
89c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
89d0: 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
89e0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
89f0: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
8a00: 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
8a10: 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
8a20: 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
8a30: 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
8a40: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
8a50: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8a60: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
8a70: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
8a80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8a90: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
8aa0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8ab0: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
8ac0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8ad0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
8ae0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
8af0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
8b00: 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
8b10: 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
8b20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8b30: 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
8b40: 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
8b50: 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
8b60: 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
8b70: 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
8b80: 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
8b90: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
8ba0: 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
8bb0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
8bc0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
8bd0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
8be0: 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
8bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8c00: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
8c10: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
8c20: 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
8c30: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  f);.  if( rc ){.
8c40: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8c50: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
8c60: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
8c70: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
8c80: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ONE;.  }..  /* R
8cb0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
8cc0: 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
8cd0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8ce0: 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
8cf0: 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
8d00: 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
8d10: 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
8d20: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
8d30: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
8d40: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
8d50: 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
8d60: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
8d70: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
8d80: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
8d90: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8da0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8db0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
8dc0: 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
8dd0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8de0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8df0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
8e00: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8e10: 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
8e20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8e30: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8e40: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
8e50: 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
8e60: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8e70: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
8e80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
8e90: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
8ea0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8eb0: 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
8ec0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
8ed0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
8ee0: 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
8ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8f00: 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
8f10: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
8f20: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  ader */.    u16 
8f30: 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20  iPageSize16;    
8f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
8f50: 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e   of iPageSize in
8f60: 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65   16-bit variable
8f70: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
8f80: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
8f90: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
8fa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8fb0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
8fc0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8fd0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8fe0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8ff0: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
9000: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
9010: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
9020: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
9030: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
9040: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
9050: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
9060: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
9070: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9080: 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20  the values read 
9090: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69  from the page-si
90a0: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
90b0: 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  ze fields.    **
90c0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
90d0: 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e  e. To be 'in ran
90e0: 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ge', both values
90f0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f   need to be a po
9100: 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77  wer.    ** of tw
9110: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
9120: 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20  r equal to 512, 
9130: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
9140: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
9150: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
9160: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
9170: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
9180: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
9190: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
91a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
91b0: 74 6f 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20  torSize<512.    
91c0: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
91d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
91e0: 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
91f0: 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
9200: 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
9210: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
9220: 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
9230: 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
9240: 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
9250: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
9260: 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
9270: 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
9280: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
9290: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
92a0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
92b0: 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
92c0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
92d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
92e0: 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
92f0: 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
9300: 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
9310: 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
9320: 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
9330: 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
9340: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
9350: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
9360: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
9370: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9380: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
9390: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
93a0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
93b0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
93c0: 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
93d0: 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
93e0: 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
93f0: 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
9400: 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
9410: 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
9420: 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
9430: 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
9440: 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28   iPageSize16 = (
9450: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
9460: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
9470: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9480: 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
9490: 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74  ze16, -1);.    t
94a0: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
94b0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73  ITE_OK );.    as
94c0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
94d0: 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65  _OK || iPageSize
94e0: 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69  16==(u16)iPageSi
94f0: 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ze );..    /* Up
9500: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
9510: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
9520: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9530: 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20  used by .    ** 
9540: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9550: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
9560: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
9570: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a  ournal was.    *
9580: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
9590: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
95a0: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
95b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
95c0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
95d0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
95e0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
95f0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
9600: 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67  ue.    ** of Pag
9610: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
9620: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
9630: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
9640: 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tine..    */.   
9650: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
9660: 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  ize = iSectorSiz
9670: 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  e;.  }..  pPager
9680: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9690: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
96a0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
96b0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
96c0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
96d0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
96e0: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
96f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
9700: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
9710: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
9720: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
9730: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9740: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
9750: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
9760: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
9770: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
9780: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
9790: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
97a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
97b0: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
97c0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
97d0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
97e0: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
97f0: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
9800: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
9810: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
9820: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
9830: 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20  **   + N bytes: 
9840: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  Master journal f
9850: 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38  ilename in utf-8
9860: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
9870: 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d  : N (length of m
9880: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9890: 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20  me in bytes, no 
98a0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e  nul-terminator).
98b0: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
98c0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
98d0: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
98e0: 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61  *   + 8 bytes: a
98f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
9900: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
9910: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
9920: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
9930: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
9940: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
9950: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68  journal name, wh
9960: 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73  ere each byte is
9970: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
9980: 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69  a signed 8-bit i
9990: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  nteger..**.** If
99a0: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
99b0: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
99c0: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
99d0: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
99e0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
99f0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
9a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9a10: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
9a20: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
9a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
9a40: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
9a70: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
9a80: 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20  t nMaster;      
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9aa0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  * Length of stri
9ab0: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  ng zMaster */.  
9ac0: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
9af0: 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  ader in journal 
9b00: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72  file */.  i64 jr
9b10: 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  nlSize;         
9b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9b30: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ze of journal fi
9b40: 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20  le on disk */.  
9b50: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20  u32 cksum = 0;  
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20   /* Checksum of 
9b80: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
9b90: 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  /..  if( !zMaste
9ba0: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
9bb0: 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61  Master.   || pPa
9bc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9bd0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9be0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
9bf0: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
9c00: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c10: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9c20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9c30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
9c40: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9c50: 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
9c60: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9c70: 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  fd) );..  /* Cal
9c80: 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
9c90: 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
9ca0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
9cb0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
9cc0: 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
9cd0: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
9ce0: 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
9cf0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
9d00: 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
9d10: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
9d20: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
9d30: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
9d40: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
9d50: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
9d60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9d70: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
9d80: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
9d90: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
9da0: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
9db0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
9dc0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
9dd0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
9de0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
9df0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9e00: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
9e10: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
9e20: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
9e30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9e40: 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
9e50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9e60: 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
9e70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9e80: 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
9e90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9ea0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
9eb0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
9ec0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
9ed0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9ee0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9ef0: 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
9f00: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
9f10: 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
9f20: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
9f30: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9f40: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
9f50: 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
9f60: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
9f70: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
9f80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9f90: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
9fa0: 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
9fb0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
9fc0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
9fd0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
9fe0: 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
9ff0: 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
a000: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
a010: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
a020: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
a030: 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
a050: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a060: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
a070: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
a080: 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67  ster+20);.  pPag
a090: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
a0a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
a0b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
a0c0: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
a0d0: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
a0e0: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
a0f0: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
a100: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
a110: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a120: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
a130: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
a140: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
a150: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
a160: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
a170: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
a180: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
a190: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
a1a0: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
a1b0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
a1c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
a1d0: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
a1e0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
a1f0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
a200: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
a210: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
a220: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
a230: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
a240: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
a250: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
a260: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
a270: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
a280: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
a290: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
a2a0: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
a2b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
a2c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
a2d0: 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
a2e0: 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
a2f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
a300: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a310: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
a320: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
a330: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
a340: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a350: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
a360: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
a370: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
a380: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
a390: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
a3a0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
a3b0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
a3c0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
a3d0: 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
a3e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
a3f0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
a400: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
a410: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
a420: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
a450: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
a460: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
a470: 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
a480: 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
a490: 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
a4a0: 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
a4b0: 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
a4c0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
a4d0: 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
a4e0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
a4f0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
a500: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
a510: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
a520: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
a530: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
a540: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
a550: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
a560: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
a570: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66  memory pages. If
a580: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73  .** the pager is
a590: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
a5a0: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
a5b0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
a5c0: 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20  * TODO: Why can 
a5d0: 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65  we not reset the
a5e0: 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20   pager while in 
a5f0: 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a  error state?.*/.
a600: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
a610: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
a620: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51  Pager){.  if( SQ
a630: 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d  LITE_OK==pPager-
a640: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
a650: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
a660: 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
a670: 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ckup);.    sqlit
a680: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
a690: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
a6a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
a6b0: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
a6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
a6d0: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
a6e0: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
a6f0: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
a700: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
a710: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
a720: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
a730: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
a740: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
a750: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
a760: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
a770: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
a780: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
a790: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a7a0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
a7b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a7c0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
a7d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a7e0: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
a7f0: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
a800: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
a810: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
a820: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
a830: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
a840: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
a850: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
a860: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
a870: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
a880: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
a890: 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
a8a0: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
a8b0: 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
a8c0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a8d0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
a8e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a8f0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
a900: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
a910: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
a920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
a930: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
a940: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
a950: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
a960: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
a970: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
a980: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
a990: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
a9a0: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
a9b0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
a9c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
a9d0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
a9e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
a9f0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
aa00: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
aa10: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
aa20: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
aa30: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
aa40: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
aa50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa60: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aa70: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
aa80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
aa90: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
aaa0: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
aab0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
aac0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
aad0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
aae0: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
aaf0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
ab00: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
ab10: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
ab20: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
ab30: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
ab40: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
ab50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ab60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
ab70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ab80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ab90: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
aba0: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
abb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
abc0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
abd0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
abe0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
abf0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
ac00: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
ac10: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
ac20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
ac30: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
ac40: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
ac50: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
ac60: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
ac70: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
ac80: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
ac90: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
aca0: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
acb0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
acc0: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
acd0: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
ace0: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
acf0: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
ad00: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
ad10: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
ad20: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
ad30: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
ad40: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
ad50: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
ad60: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
ad70: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
ad80: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ad90: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
ada0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
adb0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
ade0: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
adf0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
ae00: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
ae10: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
ae20: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
ae30: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
ae40: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
ae50: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
ae60: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
ae70: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
ae80: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
ae90: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
aea0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
aeb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
aec0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
aed0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
aee0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
aef0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
af00: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
af10: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
af20: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
af30: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
af40: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
af50: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
af60: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
af70: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
af80: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
af90: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
afa0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
afb0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
afc0: 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c  pens. TODO: Real
afd0: 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74  ly, this doesn't
afe0: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
aff0: 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c  red.    ** until
b000: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
b010: 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20  ter check fails 
b020: 69 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  in pagerSharedLo
b030: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
b040: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
b050: 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72  alid = 0;..    r
b060: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
b070: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
b080: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
b090: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b0a0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b0b0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
b0c0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
b0d0: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
b0e0: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
b0f0: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
b100: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b110: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
b120: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
b130: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
b140: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
b150: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
b160: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
b170: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
b180: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
b190: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
b1a0: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
b1b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
b1c0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
b1d0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b1e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b1f0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b200: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
b210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
b220: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
b230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
b240: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
b250: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
b260: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
b270: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
b280: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b290: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
b2a0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
b2b0: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
b2c0: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
b2d0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
b2e0: 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  d. The first arg
b2f0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
b300: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
b310: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74  .** structure, t
b320: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  he second the er
b330: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
b340: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
b350: 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49   a pager .** API
b360: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
b370: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
b380: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
b390: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a  econd argument .
b3a0: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
b3b0: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
b3c0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b3d0: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
b3e0: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
b3f0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
b400: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
b410: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
b420: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
b430: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
b440: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
b450: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
b460: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
b470: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
b480: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
b490: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
b4a0: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
b4b0: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
b4c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
b4d0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b4e0: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
b4f0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
b500: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
b510: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
b520: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
b530: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
b540: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b550: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
b560: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
b570: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
b580: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
b590: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
b5a0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
b5b0: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
b5c0: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
b5d0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
b5e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
b5f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
b600: 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
b610: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
b620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b630: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
b640: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
b650: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
b660: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
b670: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
b680: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b690: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
b6a0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
b6b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
b6c0: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
b6d0: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
b6e0: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
b6f0: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
b700: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
b710: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
b720: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
b730: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
b740: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
b750: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
b760: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
b770: 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
b780: 43 4b 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  CK .     && sqli
b790: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
b7a0: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
b7b0: 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)==0 .    ){.  
b7c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
b7d0: 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75  ger is already u
b7e0: 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61  nlocked, call pa
b7f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77  ger_unlock() now
b800: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   to.      ** cle
b810: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
b820: 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68  te and ensure th
b830: 61 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  at the pager-cac
b840: 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  he is .      ** 
b850: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
b860: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b870: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
b880: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
b890: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b8a0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
b8b0: 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
b8c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
b8d0: 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
b8e0: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
b8f0: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
b900: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
b910: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
b920: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
b930: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
b940: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
b950: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
b960: 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
b970: 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
b980: 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
b990: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
b9a0: 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
b9b0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
b9c0: 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
b9d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
b9e0: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
b9f0: 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
ba00: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
ba10: 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
ba20: 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
ba30: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
ba40: 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f  e next connectio
ba50: 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61  n.** to obtain a
ba60: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
ba70: 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68  the pager (which
ba80: 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65   may be this one
ba90: 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69  ) will.** roll i
baa0: 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
bab0: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
bac0: 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
bad0: 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
bae0: 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
baf0: 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
bb00: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
bb10: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
bb20: 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
bb30: 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
bb40: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
bb50: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57  e error state. W
bb60: 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
bb70: 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
bb80: 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
bb90: 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
bba0: 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
bbb0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
bbc0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
bbd0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bbe0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
bbf0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
bc00: 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  K && pPager->sta
bc10: 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
bc20: 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
bc30: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
bc40: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
bc50: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
bc60: 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  Pager);.    sqli
bc70: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
bc80: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  oc();.  }.  page
bc90: 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
bca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
bcb0: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
bcc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
bcd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
bce0: 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
bcf0: 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
bd00: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
bd10: 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
bd20: 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
bd30: 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
bd40: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
bd50: 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
bd60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bd70: 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
bd80: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
bd90: 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
bda0: 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
bdb0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
bdc0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
bdd0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
bde0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bdf0: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
be00: 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   or PAGER_UNLOCK
be10: 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
be20: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
be30: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
be40: 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51  o-op (returns SQ
be50: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
be60: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
be70: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
be80: 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
be90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
bea0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
beb0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
bec0: 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
bed0: 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
bee0: 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
bef0: 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
bf00: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
bf10: 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
bf20: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
bf30: 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
bf40: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
bf50: 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
bf60: 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
bf70: 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
bf80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
bf90: 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
bfa0: 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
bfb0: 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
bfc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
bfd0: 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
bfe0: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
bff0: 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
c000: 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
c010: 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
c020: 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
c030: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
c040: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c050: 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
c060: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
c070: 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
c080: 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
c090: 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
c0a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
c0b0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
c0c0: 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
c0d0: 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
c0e0: 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
c0f0: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
c100: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
c110: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c120: 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
c130: 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
c140: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c150: 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
c160: 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
c170: 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
c180: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c190: 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
c1a0: 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
c1b0: 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
c1c0: 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
c1d0: 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
c1e0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
c1f0: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
c200: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
c210: 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
c220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
c230: 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
c240: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
c250: 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
c260: 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
c270: 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
c280: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c290: 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
c2a0: 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
c2b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c2c0: 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
c2d0: 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
c2e0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
c2f0: 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
c300: 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
c310: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c320: 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
c330: 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
c340: 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
c350: 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
c360: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
c370: 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
c380: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
c390: 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  if running in no
c3a0: 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n-exclusive mode
c3b0: 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d  , the.** pager m
c3c0: 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48  oves to PAGER_SH
c3d0: 41 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20  ARED state (and 
c3e0: 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c  downgrades the l
c3f0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ock on the.** da
c400: 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f  tabase file acco
c410: 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  rdingly)..**.** 
c420: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
c430: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
c440: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73  sive mode and is
c450: 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44   in PAGER_SYNCED
c460: 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f   state,.** it mo
c470: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ves to PAGER_EXC
c480: 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73  LUSIVE. No locks
c490: 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20   are downgraded 
c4a0: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a  when running in.
c4b0: 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  ** exclusive mod
c4c0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
c4d0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
c4e0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
c4f0: 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
c500: 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
c510: 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
c520: 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
c530: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
c540: 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
c550: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c560: 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
c570: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c580: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
c590: 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
c5a0: 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
c5b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c5c0: 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
c5d0: 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
c5e0: 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
c5f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c600: 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
c610: 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
c620: 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
c630: 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
c640: 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
c650: 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
c660: 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
c670: 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
c680: 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
c690: 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
c6a0: 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
c6b0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c6c0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
c6d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
c6e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
c6f0: 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  hasMaster){.  in
c700: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c710: 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  ;      /* Error 
c720: 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  code from journa
c730: 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
c740: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
c750: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
c760: 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  K;     /* Error 
c770: 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c  code from db fil
c780: 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  e unlock operati
c790: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  on */..  if( pPa
c7a0: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
c7b0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
c7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c7d0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  K;.  }.  release
c7e0: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
c7f0: 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74  ager);..  assert
c800: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c810: 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
c820: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
c830: 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
c840: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a  Pager->jfd) ){..
c850: 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65      /* TODO: The
c860: 72 65 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68  re's a problem h
c870: 65 72 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  ere if a journal
c880: 2d 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  -file was opened
c890: 20 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a   in MEMORY.    *
c8a0: 2a 20 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20  * mode and then 
c8b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
c8c0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
c8d0: 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49  RUNCATE or PERSI
c8e0: 53 54 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  ST.    ** during
c8f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c900: 2e 20 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75  . This code shou
c910: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ld be changed to
c920: 20 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74   assume.    ** t
c930: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
c940: 6d 6f 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61  mode has not cha
c950: 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 74  nged since the t
c960: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20  ransaction was. 
c970: 20 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41     ** started. A
c980: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  nd the sqlite3Pa
c990: 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29  gerJournalMode()
c9a0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c9b0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67   be.    ** chang
c9c0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
c9d0: 74 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65  that this is the
c9e0: 20 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a   case too..    *
c9f0: 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  /..    /* Finali
ca00: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
ca10: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
ca20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ca30: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ca40: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
ca50: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d  .      int isMem
ca60: 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  oryJournal = sql
ca70: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
ca80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
ca90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
caa0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
cab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4d  ;.      if( !isM
cac0: 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a  emoryJournal ){.
cad0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cae0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
caf0: 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
cb00: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
cb10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
cb20: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
cb30: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cb40: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
cb50: 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
cb60: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
cb70: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
cb80: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cb90: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
cba0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
cbb0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
cbc0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
cbd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cbe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cbf0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
cc00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
cc10: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
cc20: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
cc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
cc40: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
cc50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cc60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
cc70: 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20  RSIST.    ){.   
cc80: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
cc90: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
cca0: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
ccb0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
ccc0: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
ccd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cce0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
ccf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
cd00: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
cd10: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
cd20: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
cd30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
cd40: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
cd50: 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20   || rc );.      
cd60: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cd70: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cd80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cd90: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
cda0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cdb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cdc0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
cdd0: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
cde0: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
cdf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
ce00: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
ce10: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
ce20: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
ce30: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
ce40: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
ce50: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
ce60: 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  f..    sqlite3Pc
ce70: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
ce80: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
ce90: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
cea0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ceb0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
cec0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
ced0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  nal = 0;.    pPa
cee0: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cef0: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cf00: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
cf10: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
cf20: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
cf30: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
cf40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cf50: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
cf60: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
cf70: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cf80: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cf90: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
cfa0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
cfb0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cfc0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
cfd0: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
cfe0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
cff0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
d000: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
d010: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
d020: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
d030: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
d040: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
d050: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
d060: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
d070: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d080: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
d090: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
d0a0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
d0b0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
d0c0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
d0d0: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
d0e0: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
d0f0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
d100: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
d110: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
d120: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
d130: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
d140: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
d150: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
d160: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
d170: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
d180: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
d190: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
d1a0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
d1b0: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
d1c0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
d1d0: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
d1e0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
d1f0: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
d200: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
d210: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
d220: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
d230: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
d240: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
d250: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
d260: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
d270: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
d280: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
d290: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
d2a0: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
d2b0: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
d2c0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d2d0: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
d2e0: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
d2f0: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
d300: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
d310: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
d320: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
d330: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
d340: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
d350: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
d360: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
d370: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
d380: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
d390: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d3a0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d3b0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d3c0: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
d3d0: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
d3e0: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
d3f0: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
d400: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
d410: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
d420: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
d430: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
d440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
d450: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
d460: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
d470: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
d480: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
d490: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
d4a0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
d4b0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
d4c0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
d4d0: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
d4e0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d4f0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d500: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d510: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d520: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d530: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d540: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
d550: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
d560: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d570: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
d580: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
d590: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d5a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
d5b0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d5c0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d5d0: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d5e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d5f0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
d600: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d610: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
d620: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
d630: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
d640: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
d650: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
d660: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
d670: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
d680: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
d690: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
d6a0: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
d6b0: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
d6c0: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
d6d0: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
d6e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d6f0: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
d700: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d710: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
d720: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
d730: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
d740: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d750: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
d760: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
d770: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
d780: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
d790: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
d7a0: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
d7b0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
d7c0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
d7d0: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
d7e0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
d7f0: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
d800: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d810: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d820: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
d830: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
d840: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
d850: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
d860: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
d870: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d880: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
d890: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
d8a0: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
d8b0: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
d8c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
d8d0: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d8e0: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
d8f0: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
d900: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
d910: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
d920: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d930: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
d940: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
d950: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
d960: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
d970: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
d980: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
d990: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
d9a0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
d9b0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
d9c0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d9d0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d9e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d9f0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
da00: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
da10: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
da20: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
da30: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
da40: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
da50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
da60: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
da70: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
da80: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
da90: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
daa0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
dab0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
dac0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
dad0: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
dae0: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
daf0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
db00: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
db10: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
db20: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
db30: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
db40: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
db50: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
db60: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
db70: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
db80: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
db90: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
dba0: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
dbb0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
dbc0: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
dbd0: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
dbe0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
dbf0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
dc00: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
dc10: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
dc20: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
dc30: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
dc40: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
dc50: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
dc60: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
dc70: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
dc80: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dc90: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
dca0: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
dcb0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
dcc0: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
dcd0: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
dce0: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
dcf0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
dd00: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
dd10: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
dd20: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
dd30: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
dd40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
dd50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
dd60: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
dd70: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
dd80: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
dd90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dda0: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
ddb0: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
ddc0: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
ddd0: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
dde0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
ddf0: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
de00: 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63  /.  int isUnsync
de10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
de20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
de30: 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63  ding from unsync
de40: 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ed main journal 
de50: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
de60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
de70: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
de80: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
de90: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  ck */.  int isSa
dea0: 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20  vepnt,          
deb0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
dec0: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
ded0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  llback */.  Bitv
dee0: 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20  ec *pDone       
def0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
df00: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
df10: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
df20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
df30: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
df60: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
df70: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
df80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dfa0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
dfb0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
dfc0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
dff0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
e000: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
e010: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
e020: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
e030: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
e040: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
e050: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
e060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e070: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
e080: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
e090: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  nal file */..  a
e0a0: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
e0b0: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
e0c0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
e0d0: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
e0e0: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
e0f0: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
e100: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
e110: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
e120: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
e130: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
e140: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
e150: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
e160: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
e170: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
e180: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
e190: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
e1a0: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
e1b0: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
e1c0: 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54   (u8*)pPager->pT
e1d0: 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
e1e0: 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
e1f0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
e200: 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
e210: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
e220: 61 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  ated */..  /* Re
e230: 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
e240: 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
e250: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
e260: 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
e270: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
e280: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
e290: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
e2a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
e2b0: 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
e2c0: 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
e2d0: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
e2e0: 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
e2f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e300: 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
e310: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
e320: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e330: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
e340: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
e350: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e360: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
e370: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
e380: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e390: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
e3a0: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
e3b0: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
e3c0: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
e3d0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
e3e0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
e3f0: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
e400: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
e410: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
e420: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
e430: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
e440: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
e450: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
e460: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
e470: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
e480: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
e490: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e4a0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
e4b0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
e4c0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
e4d0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
e4e0: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
e4f0: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
e500: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
e510: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
e520: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
e530: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
e540: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
e550: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e560: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
e570: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
e580: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
e590: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
e5a0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
e5b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e5c0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
e5d0: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
e5e0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
e5f0: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
e600: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
e610: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e620: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
e630: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
e640: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
e650: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
e660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e670: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e680: 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
e690: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
e6a0: 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
e6b0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
e6c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e6d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
e6e0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
e6f0: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
e700: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e710: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
e720: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
e730: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
e740: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
e750: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
e760: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
e770: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
e780: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
e790: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
e7a0: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
e7b0: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
e7c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e7d0: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
e7e0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
e7f0: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
e800: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
e810: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
e820: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
e830: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
e840: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
e850: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
e860: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
e870: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
e880: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e890: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
e8a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e8b0: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
e8c0: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
e8d0: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
e8e0: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
e8f0: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
e900: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
e910: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
e920: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
e930: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
e940: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
e950: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
e960: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
e970: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
e980: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
e990: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
e9a0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e9b0: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
e9c0: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
e9d0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
e9e0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
e9f0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
ea00: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
ea10: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
ea20: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
ea30: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
ea40: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
ea50: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
ea60: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
ea70: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
ea80: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
ea90: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
eaa0: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
eab0: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
eac0: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
ead0: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
eae0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
eaf0: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
eb00: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
eb10: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
eb20: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
eb30: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
eb40: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
eb50: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
eb60: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
eb70: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
eb80: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
eb90: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
eba0: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
ebb0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
ebc0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
ebd0: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
ebe0: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
ebf0: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
ec00: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
ec10: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
ec20: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
ec30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
ec40: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
ec50: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
ec60: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
ec70: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
ec80: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
ec90: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
eca0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
ecb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ecc0: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
ecd0: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
ece0: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
ecf0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
ed00: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
ed10: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
ed20: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
ed30: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ed40: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
ed50: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
ed60: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
ed70: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
ed80: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
ed90: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
eda0: 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
edb0: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
edc0: 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
edd0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
ede0: 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
edf0: 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
ee00: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
ee10: 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
ee20: 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
ee30: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
ee40: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
ee50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
ee60: 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
ee70: 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  ened..  */.  pPg
ee80: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
ee90: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
eea0: 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
eeb0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45  !MEMDB );.  PAGE
eec0: 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
eed0: 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
eee0: 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
ef00: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
ef10: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
ef20: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
ef30: 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20  Size, aData),.  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73               (is
ef50: 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
ef60: 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
ef70: 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
ef80: 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
ef90: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
efa0: 56 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d  VE).   && (pPg==
efb0: 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
efc0: 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
efd0: 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70  YNC)).   && isOp
efe0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
eff0: 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20    && !isUnsync. 
f000: 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
f010: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
f020: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
f030: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
f040: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
f050: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
f060: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
f070: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
f080: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
f090: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f0a0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
f0b0: 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
f0c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
f0d0: 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
f0e0: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
f0f0: 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
f100: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
f110: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f120: 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
f130: 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
f140: 6e 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  no, aData);.    
f150: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
f160: 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c   aData, pgno, 0,
f170: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
f180: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f190: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
f1a0: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
f1b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f1c0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
f1d0: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
f1e0: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
f1f0: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
f200: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
f210: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
f220: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
f230: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
f240: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
f250: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
f260: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
f270: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
f280: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
f290: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f2a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f2b0: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
f2c0: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
f2d0: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f2e0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f2f0: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f300: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f310: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f320: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f330: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f340: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f350: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f360: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f370: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f380: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f390: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f3a0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f3b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f3c0: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f3d0: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f3e0: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f3f0: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f400: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f410: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f420: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f430: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f440: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f450: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f460: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f470: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f480: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f490: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f4a0: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f4b0: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f4c0: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f4d0: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f4e0: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f4f0: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f500: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f510: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f520: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f530: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f540: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f550: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f560: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f580: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f590: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f5a0: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f5b0: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f5c0: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f5d0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f5e0: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f5f0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f600: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f610: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f620: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f630: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f640: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f650: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f660: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f670: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f680: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f690: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f6a0: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f6b0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f6c0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f6d0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f6e0: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f6f0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f700: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f710: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f720: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f730: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f740: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f750: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f760: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
f770: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
f780: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
f790: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
f7a0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f7b0: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ter(pPg);.    }.
f7c0: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f7d0: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f7e0: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f7f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f800: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f810: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f820: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f830: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f840: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f850: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f860: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f870: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f880: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f890: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f8a0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f8b0: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f8c0: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f8d0: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f8e0: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f8f0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f900: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f910: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f920: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f930: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f940: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f950: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f960: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f970: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f980: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f990: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f9a0: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f9b0: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f9c0: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f9d0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f9e0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f9f0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
fa00: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
fa10: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
fa20: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
fa30: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
fa40: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
fa50: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
fa60: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
fa70: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
fa80: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
fa90: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
faa0: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
fab0: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
fac0: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
fad0: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
fae0: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
faf0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
fb00: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
fb10: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
fb20: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
fb30: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
fb40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
fb50: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
fb60: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
fb70: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
fb80: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
fb90: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
fba0: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
fbb0: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
fbc0: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
fbd0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
fbe0: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
fbf0: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
fc00: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
fc10: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
fc20: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
fc30: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
fc40: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
fc50: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
fc60: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
fc70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fc80: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
fc90: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
fca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
fcb0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
fcc0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
fcd0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fce0: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fcf0: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fd00: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fd10: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fd20: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fd30: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fd40: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fd50: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fd60: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fd70: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
fd80: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fd90: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fda0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fdb0: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fdc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
fdd0: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fde0: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fdf0: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fe00: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fe10: 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
fe20: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
fe30: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fe40: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fe50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
fe60: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
fe70: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
fe80: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
fe90: 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EST)./*.** This 
fea0: 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68  routine looks ah
feb0: 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ead into the mai
fec0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
fed0: 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a  nd determines.**
fee0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
fef0: 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20  the next record 
ff00: 28 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74  (the record that
ff10: 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a   begins at file.
ff20: 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  ** offset pPager
ff30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73  ->journalOff) is
ff40: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70   a well-formed p
ff50: 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69  age record consi
ff60: 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61  sting.** of a va
ff70: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c  lid page number,
ff80: 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65   pPage->pageSize
ff90: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
ffa0: 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62  t, followed.** b
ffb0: 79 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73  y a valid checks
ffc0: 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  um..**.** The pa
ffd0: 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ger never needs 
ffe0: 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20  to know this in 
fff0: 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20  order to do its 
10000 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72  job.   This.** r
10010 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
10020 73 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73  sed from with as
10030 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
10040 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
10050 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10060 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
10070 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
10080 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
10090 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
100a0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
100b0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
100c0 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
100d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
100e0 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
100f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10100 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10110 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
10120 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
10130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
10140 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
10150 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
10160 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
10170 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
10180 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
10190 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
101a0 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
101b0 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
101c0 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
101d0 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
101e0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
101f0 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
10210 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
10220 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10230 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10260 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
10270 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
10280 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
10290 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
102a0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
102b0 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
102c0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
102d0 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
102e0 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
102f0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10300 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
10310 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
10320 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
10330 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
10340 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
10350 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
10360 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
10370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
10380 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
103b0 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
103c0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
103d0 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
103e0 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
103f0 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
10400 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
10410 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
10420 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10430 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
10440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
10450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10460 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
10470 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
104a0 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
104b0 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
104c0 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
104d0 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
104e0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
104f0 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
10500 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
10510 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
10520 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
10530 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10540 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
10550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
10560 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
10570 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
10580 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
10590 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
105a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
105b0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
105c0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
105d0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
105e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
105f0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
10600 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
10610 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10620 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
10630 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10640 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10650 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
10660 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
10670 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
10680 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
10690 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
106a0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
106b0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
106c0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
106d0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
106e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
106f0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
10700 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
10710 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
10720 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
10730 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
10740 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
10750 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
10760 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
10770 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
10780 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
10790 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
107a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
107b0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
107c0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
107d0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
107e0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
107f0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
10800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10810 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
10820 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
10830 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
10840 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
10850 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
10860 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
10870 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
10880 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
10890 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
108a0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
108b0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
108c0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
108d0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
108e0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
108f0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10900 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10910 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10920 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10930 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10940 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10950 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10960 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10970 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
10980 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
10990 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
109a0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
109b0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
109c0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
109d0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
109e0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
109f0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10a00 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10a10 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10a20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10a30 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10a40 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10a50 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10a60 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10a70 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10a90 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
10aa0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
10ab0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
10ac0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
10ad0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10ae0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10af0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10b00 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10b10 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10b20 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10b30 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10b40 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10b50 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10b60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10b70 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10b80 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
10b90 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
10ba0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
10bb0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
10bc0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
10bd0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
10be0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10bf0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10c00 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10c10 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10c20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10c30 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10c40 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10c50 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10c60 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10c70 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10c90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ca0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10cb0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10cc0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10cd0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
10ce0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10cf0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10d00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10d10 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10d20 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10d30 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10d40 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10d50 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10d60 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10d90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10da0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10db0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10dc0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10dd0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10de0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10df0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10e00 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10e10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10e20 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10e30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10e40 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10e50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10e60 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10e70 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10e80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10e90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ea0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10eb0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10ec0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10ed0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10ee0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10ef0 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10f00 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10f10 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10f20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10f30 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10f40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10f50 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10f60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10f70 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10f80 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10f90 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
10fa0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
10fb0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
10fc0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
10fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10ff0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
11000 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11010 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11020 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
11030 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11040 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
11050 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
11060 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
11070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11080 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
11090 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
110a0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
110b0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
110c0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
110d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
110e0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
110f0 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
11100 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
11110 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
11120 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
11130 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
11140 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
11150 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
11160 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
11170 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
11180 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11190 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
111a0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
111b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
111c0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
111d0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
111e0 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
111f0 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11200 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
11210 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11220 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11230 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
11240 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
11250 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11270 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
11280 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
11290 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
112a0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
112b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
112c0 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
112d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
112e0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
112f0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
11300 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
11310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11320 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11330 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
11340 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
11350 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
11360 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
11370 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
11380 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
11390 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
113a0 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
113b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
113c0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
113d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
113e0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
113f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11410 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11420 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
11430 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
11440 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
11450 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
11460 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
11470 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11480 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
11490 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
114a0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
114b0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
114c0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
114d0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
114e0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
114f0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
11500 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11520 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
11530 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11540 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11550 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
11560 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
11570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11580 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
11590 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
115a0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
115b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
115c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
115d0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
115e0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
115f0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
11600 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11610 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
11620 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
11630 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
11640 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
11650 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
11660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11680 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11690 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
116a0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
116b0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
116c0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
116d0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
116e0 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
116f0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
11700 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
11710 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11730 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
11740 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11750 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
11760 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
11770 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
11780 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
11790 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
117a0 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
117b0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
117c0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
117d0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
117e0 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
117f0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11800 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
11810 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
11820 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
11830 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11840 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
11850 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
11860 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
11870 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11880 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11890 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
118a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
118b0 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
118c0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
118d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
118e0 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
118f0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
11900 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11910 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
11920 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
11930 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
11940 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
11950 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
11960 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
11970 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
11980 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11990 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
119a0 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
119b0 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
119c0 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
119d0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
119e0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
119f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
11a00 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
11a10 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
11a20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
11a30 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11a40 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11a50 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11a60 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11a70 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
11a80 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
11a90 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
11aa0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
11ab0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
11ac0 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
11ad0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
11ae0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
11af0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
11b00 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
11b10 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
11b20 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
11b30 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11b40 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11b50 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11b60 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11b70 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
11b80 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
11b90 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
11ba0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
11bb0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
11bc0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
11bd0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
11be0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
11bf0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
11c00 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11c20 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
11c30 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11c40 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11c50 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11c60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11c70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11c90 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11ca0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11cb0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11cd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11ce0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
11cf0 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
11d00 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
11d10 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
11d20 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
11d30 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11d40 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11d50 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11d60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11d70 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11d80 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11d90 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11da0 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11db0 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11dc0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11de0 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11df0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11e00 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11e10 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11e30 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11e40 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11e70 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11e80 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11e90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11ec0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11ed0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11ee0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11f00 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11f10 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11f20 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11f30 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11f40 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11f50 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11f60 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11f70 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11f80 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11f90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
11fa0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
11fb0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
11fc0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
11fd0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
11fe0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
11ff0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
12000 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12010 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
12020 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
12030 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
12040 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
12050 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
12060 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
12070 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
12080 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
12090 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
120a0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
120b0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
120c0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
120d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
120e0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
120f0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
12100 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
12110 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
12120 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
12130 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
12140 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
12150 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
12160 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
12170 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
12180 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
12190 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
121a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
121b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
121c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
121d0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
121e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
121f0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
12200 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
12210 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
12220 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
12230 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
12240 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
12250 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
12260 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
12270 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
12280 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
12290 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
122a0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
122b0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
122c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
122d0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
122e0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
122f0 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
12300 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12310 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12320 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12330 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
12340 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
12350 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
12360 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
12370 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12380 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
12390 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
123a0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
123b0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
123c0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
123d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
123e0 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
123f0 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12400 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12410 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12420 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12430 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
12440 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
12450 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
12460 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
12470 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
12480 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
12490 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
124a0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
124b0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
124c0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
124d0 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
124e0 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
124f0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12500 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
12510 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
12520 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
12530 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
12540 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
12550 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
12560 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12570 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
12580 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
12590 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
125a0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
125b0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
125c0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
125d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
125e0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
125f0 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
12600 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
12610 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
12620 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12630 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12640 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
12650 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
12660 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
12670 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
12680 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
12690 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
126a0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
126b0 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
126c0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
126d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
126e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
126f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
12700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
12710 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
12720 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
12730 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
12740 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
12750 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
12760 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
12770 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
12780 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12790 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
127a0 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
127b0 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
127c0 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
127d0 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
127e0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
127f0 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
12800 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
12810 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
12820 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
12830 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
12840 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
12850 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
12860 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
12870 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
12880 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
12890 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
128a0 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
128b0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
128c0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
128d0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
128e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
128f0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
12900 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12910 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
12920 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
12930 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12940 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
12950 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
12960 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
12970 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
12980 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
12990 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
129a0 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
129b0 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
129c0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
129d0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
129e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
129f0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
12a00 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
12a10 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
12a20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
12a30 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12a40 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12a50 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12a70 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
12a80 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
12a90 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
12aa0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
12ab0 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
12ac0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
12ad0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
12ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12af0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
12b00 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
12b10 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
12b20 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
12b30 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12b40 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12b50 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12b60 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12b70 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12b80 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
12b90 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
12ba0 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
12bb0 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
12bc0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
12bd0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
12be0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
12bf0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
12c00 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
12c10 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
12c20 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
12c30 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12c40 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12c50 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12c60 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12c70 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12c80 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12c90 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12ca0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12cb0 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12cc0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12cd0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
12ce0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
12cf0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
12d00 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
12d10 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
12d20 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
12d30 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12d40 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12d50 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12d60 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12d70 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12d90 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12da0 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12db0 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12dc0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12dd0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12de0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12df0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12e00 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12e10 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12e20 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12e30 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12e40 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12e50 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12e60 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12e70 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12e80 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12e90 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12ea0 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12eb0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12ec0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12ed0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12ee0 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12ef0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12f00 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12f10 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12f20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12f30 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12f40 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12f50 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12f60 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12f70 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12f80 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12f90 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
12fa0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
12fb0 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
12fc0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
12fd0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
12fe0 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
12ff0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
13000 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
13010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13020 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
13030 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
13040 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
13050 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
13060 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
13070 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
13080 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
13090 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
130a0 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
130d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
130e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
130f0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
13100 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13110 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
13120 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
13130 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
13140 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
13150 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
13160 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
13170 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
13180 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
13190 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
131a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
131d0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
131e0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
131f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13200 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13210 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
13220 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
13230 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
13240 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
13250 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13260 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
13270 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
13280 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
13290 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
132a0 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
132b0 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
132c0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
132d0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
132e0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
132f0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
13300 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
13310 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
13320 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
13330 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13340 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13350 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
13360 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
13370 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13380 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
13390 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
133a0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
133b0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
133c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
133d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
133e0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
133f0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
13400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13410 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
13420 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
13430 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
13440 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
13450 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
13460 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
13470 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
13480 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
13490 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
134a0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
134b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
134c0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
134d0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
134e0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
134f0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
13500 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
13510 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
13520 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
13530 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
13540 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
13550 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13560 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
13570 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
13580 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
13590 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
135a0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
135b0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
135c0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
135d0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
135e0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
135f0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
13600 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
13610 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
13620 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
13630 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
13640 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13650 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13660 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
13670 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
13680 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
13690 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
136a0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
136b0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
136c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
136d0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
136e0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
136f0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
13700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13710 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
13720 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
13730 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
13740 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
13750 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
13760 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
13770 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
13780 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
13790 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
137a0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
137b0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
137c0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
137d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73  ){.    int isUns
137e0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
137f0 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
13800 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
13810 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
13820 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
13830 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
13840 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
13850 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
13860 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
13870 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
13880 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
13890 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
138a0 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
138b0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
138c0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
138d0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
138e0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
138f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
13910 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
13920 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
13930 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
13940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13950 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
13960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13970 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13990 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
139a0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
139b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
139c0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
139d0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
139e0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
139f0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
13a00 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
13a10 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
13a20 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13a30 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
13a40 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
13a50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
13a60 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
13a70 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
13a80 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
13a90 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
13aa0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
13ab0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
13ac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13ad0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
13ae0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
13af0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13b00 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13b10 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
13b20 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
13b30 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
13b40 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
13b50 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
13b60 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
13b70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
13b80 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
13b90 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
13ba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
13bb0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
13bc0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
13bd0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
13be0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
13bf0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
13c00 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
13c10 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
13c20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
13c30 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
13c40 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
13c50 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
13c60 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
13c70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
13c80 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
13c90 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
13ca0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
13cb0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
13cc0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
13cd0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
13ce0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
13cf0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
13d00 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
13d10 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
13d20 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
13d30 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
13d40 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
13d50 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
13d60 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
13d70 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
13d80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
13d90 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
13da0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
13db0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
13dc0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
13dd0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
13de0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
13df0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13e00 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
13e10 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
13e20 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
13e30 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
13e40 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
13e50 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
13e60 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
13e70 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13e80 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
13e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
13ea0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65  e..    */.    te
13eb0 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20  stcase( nRec==0 
13ec0 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20  && !isHot.      
13ed0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
13ee0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
13ef0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21  _HDR_SZ(pPager)!
13f00 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
13f10 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20  Off.         && 
13f20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
13f30 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
13f40 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13f50 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20  er))>0.         
13f60 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72  && pagerNextJour
13f70 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70  nalPageIsValid(p
13f80 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
13f90 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
13fa0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
13fb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13fc0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
13fd0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
13fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13ff0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
14000 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
14010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14020 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
14030 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
14040 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a    isUnsync = 1;.
14050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14060 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
14070 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
14080 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
14090 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
140a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
140b0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
140c0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
140d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
140e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
140f0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
14100 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
14110 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
14120 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
14130 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
14140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14150 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
14160 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
14170 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14180 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
14190 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
141a0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
141b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
141c0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
141d0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
141e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
141f0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
14200 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
14210 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
14220 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
14230 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
14240 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14250 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14260 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
14270 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14280 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
14290 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
142a0 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79  (pPager,1,isUnsy
142b0 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  nc,&pPager->jour
142c0 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20  nalOff,0,0);.   
142d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
142e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
142f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14300 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
14310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14320 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
14330 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14340 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
14350 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
14360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
14370 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
14380 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
14390 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
143a0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
143b0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
143c0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
143d0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
143e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
143f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
14400 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
14410 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
14420 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
14430 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
14440 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
14450 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
14460 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
14470 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
14480 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
14490 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
144a0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
144b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
144c0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
144d0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
144e0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
144f0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
14500 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14520 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
14530 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
14540 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
14550 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
14560 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
14570 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
14580 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
14590 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
145a0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
145b0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
145c0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
145d0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
145e0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
145f0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
14600 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
14610 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
14620 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
14630 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
14640 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
14650 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
14660 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
14670 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
14680 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
14690 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
146a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
146b0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
146c0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
146d0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
146e0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
146f0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14700 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
14710 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
14720 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
14730 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14740 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
14750 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
14760 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
14770 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
14780 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
14790 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
147a0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
147b0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
147c0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
147d0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
147e0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
147f0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
14800 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
14810 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
14820 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
14830 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
14840 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
14850 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
14860 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
14870 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
14880 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
14890 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
148a0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
148b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
148c0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
148d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
148e0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
148f0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
14900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14910 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
14920 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
14930 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
14940 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
14950 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
14960 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
14970 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
14980 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
14990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
149a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
149b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
149c0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
149d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
149e0 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
149f0 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0');.    testcas
14a00 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14a10 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
14a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14a30 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
14a40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
14a50 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
14a60 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
14a70 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
14a80 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
14a90 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
14aa0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
14ab0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
14ac0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
14ad0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14ae0 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
14af0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
14b00 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14b10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
14b20 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
14b30 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
14b40 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
14b50 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
14b60 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
14b70 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
14b80 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
14b90 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
14ba0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
14bb0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
14bc0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
14bd0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
14be0 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
14bf0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
14c00 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
14c10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
14c20 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
14c30 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
14c40 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
14c50 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
14c60 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
14c70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14c80 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
14c90 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
14ca0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
14cb0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
14cc0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
14cd0 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
14ce0 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
14cf0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
14d00 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
14d10 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
14d20 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
14d30 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
14d40 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
14d50 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
14d60 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
14d70 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
14d80 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
14d90 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
14da0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
14db0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
14dc0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
14dd0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
14de0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
14df0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
14e00 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
14e10 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
14e20 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
14e30 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
14e40 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
14e50 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
14e60 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
14e70 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14e80 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
14e90 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14ea0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
14eb0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
14ec0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14ed0 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
14ee0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
14ef0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
14f00 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
14f10 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
14f20 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
14f30 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
14f40 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
14f50 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
14f60 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
14f70 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14f80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
14f90 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
14fa0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14fb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
14fc0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
14fd0 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
14fe0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14ff0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
15000 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
15010 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
15020 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
15030 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
15040 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
15050 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
15060 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
15070 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
15080 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
15090 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
150a0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
150b0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
150c0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
150d0 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
150e0 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
150f0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
15100 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
15110 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
15120 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
15130 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
15140 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
15150 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
15160 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
15170 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
15180 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15190 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
151a0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
151b0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
151c0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
151d0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
151e0 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
151f0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
15200 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
15210 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
15220 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
15230 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
15240 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15250 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
15260 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
15270 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
15280 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
15290 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
152a0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
152b0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
152c0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
152d0 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
152e0 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
152f0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
15300 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
15310 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
15320 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
15330 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
15340 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
15350 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
15360 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
15370 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
15380 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
15390 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
153a0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
153b0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
153c0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
153d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
153e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
153f0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
15400 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
15410 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
15420 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
15430 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
15440 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
15450 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15460 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
15470 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
15480 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
15490 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
154a0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
154b0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
154c0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
154d0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
154e0 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
154f0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
15500 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
15510 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15530 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
15540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15550 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
15560 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
15570 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
15580 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
15590 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
155a0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
155b0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
155c0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
155d0 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
155e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a  r->dbOrigSize;..
155f0 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
15600 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
15610 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
15620 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
15630 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
15640 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
15650 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
15660 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
15670 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
15680 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
15690 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
156a0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
156b0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
156c0 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
156d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
156e0 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
156f0 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
15700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15710 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
15720 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
15730 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
15740 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
15750 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
15760 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
15770 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
15780 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
15790 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
157a0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
157b0 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
157c0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
157d0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
157e0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
157f0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
15800 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
15810 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
15820 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
15830 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
15840 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
15850 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
15860 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
15870 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
15880 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
15890 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
158a0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
158b0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
158c0 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
158d0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
158e0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
158f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15900 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
15910 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
15920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15930 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15940 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
15950 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15960 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15970 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c  ge(pPager, 1, 0,
15980 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
15990 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  lOff, 1, pDone);
159a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
159b0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
159c0 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
159d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
159e0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
159f0 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
15a00 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15a10 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
15a20 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
15a30 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
15a40 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
15a50 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
15a60 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
15a70 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
15a80 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
15a90 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
15aa0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
15ab0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
15ac0 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
15ad0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
15ae0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
15af0 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
15b00 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15b10 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
15b20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
15b30 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
15b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15b50 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15b60 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
15b70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15b80 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
15b90 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
15ba0 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
15bb0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
15bc0 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
15bd0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
15be0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15bf0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
15c00 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
15c10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
15c20 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
15c30 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
15c40 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
15c50 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
15c60 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
15c70 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
15c80 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
15c90 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
15ca0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
15cb0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15cc0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
15cd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  /.    assert( !(
15ce0 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20  nJRec==0.       
15cf0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15d00 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15d10 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
15d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15d30 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
15d40 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
15d50 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
15d60 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
15d70 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
15d80 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
15d90 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
15da0 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20  ager)).    );.  
15db0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15dc0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15dd0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
15de0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
15df0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
15e00 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
15e10 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
15e20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
15e30 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15e40 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15e50 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15e60 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15e70 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15e80 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15e90 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15ea0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15eb0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15ec0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15ed0 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
15ee0 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
15ef0 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15f00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15f10 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
15f20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15f30 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15f40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15f50 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15f60 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15f70 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15f80 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15f90 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15fa0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15fb0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15fc0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15fd0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
15fe0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
15ff0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
16000 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
16010 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
16020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
16030 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
16040 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
16050 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16060 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
16070 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
16080 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
16090 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
160a0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
160b0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
160c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
160d0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
160e0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
160f0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
16100 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
16110 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
16120 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
16130 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
16140 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
16150 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
16160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
16170 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
16180 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
16190 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
161a0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
161b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
161c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
161d0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
161e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
161f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16200 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
16210 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
16220 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
16230 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
16240 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16250 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
16260 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
16270 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
16280 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
16290 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
162a0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
162b0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
162c0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
162d0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
162e0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
162f0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
16300 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
16310 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
16320 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
16330 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
16340 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
16350 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
16360 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
16370 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
16380 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
16390 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
163a0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
163b0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
163c0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
163d0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
163e0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
163f0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
16400 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
16410 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
16420 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
16430 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16440 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
16450 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
16460 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
16470 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
16480 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
16490 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
164a0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
164b0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
164c0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
164d0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
164e0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
164f0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
16500 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
16510 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
16520 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
16530 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
16540 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
16550 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
16560 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16570 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
16580 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
16590 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
165a0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
165b0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
165c0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
165d0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
165e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
165f0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
16600 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
16610 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
16620 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
16630 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
16640 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
16650 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16660 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
16670 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
16680 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
16690 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
166a0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
166b0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
166c0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
166d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
166e0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
166f0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
16700 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
16710 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16720 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
16730 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
16740 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
16750 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
16760 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
16770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16780 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
16790 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
167a0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
167b0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
167d0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
167e0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
167f0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
16800 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
16810 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
16820 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
16830 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
16840 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
16850 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
16860 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
16870 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
16880 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
16890 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
168a0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
168b0 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
168c0 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
168d0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
168e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
168f0 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
16900 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
16910 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16920 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
16930 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
16940 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
16950 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
16960 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
16970 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
16980 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
16990 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
169a0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
169b0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
169c0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
169d0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
169e0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
169f0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
16a00 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
16a10 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
16a20 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
16a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
16a40 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
16a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16a60 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
16a70 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
16a80 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
16a90 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
16aa0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
16ab0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
16ac0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
16ad0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
16ae0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
16af0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
16b00 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
16b10 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
16b20 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
16b30 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16b40 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16b50 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16b60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16b70 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
16b80 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16b90 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16ba0 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
16bb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16bc0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
16bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16be0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
16bf0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16c00 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
16c10 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
16c20 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
16c30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16c40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16c50 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16c60 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16c70 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16c80 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16c90 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16cb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16cc0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16cd0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
16ce0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
16cf0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
16d00 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
16d10 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
16d20 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
16d30 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16d40 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16d50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16d60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16d70 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16d80 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16d90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16db0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16dc0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16dd0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
16de0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
16df0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
16e00 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
16e10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
16e20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
16e30 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16e40 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16e50 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16e60 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16e70 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16e80 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16e90 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16ea0 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16eb0 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16ec0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16ed0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
16ee0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
16ef0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
16f00 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
16f10 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
16f20 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
16f30 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16f40 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16f50 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16f60 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16f70 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16f80 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16f90 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16fa0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16fb0 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16fc0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16fd0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16ff0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
17000 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17040 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
17050 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
17060 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
17070 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
17080 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
17090 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
170a0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
170b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
170c0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
170d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
170e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
170f0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
17100 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
17110 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
17120 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
17130 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
17140 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
17150 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
17160 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
17170 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
17180 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
17190 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
171a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
171b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
171c0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
171d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
17200 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
17210 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
17220 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
17230 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
17240 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
17250 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
17260 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17280 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
17290 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
172a0 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
172b0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
172c0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
172d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
172e0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
172f0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
17300 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
17310 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
17320 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 66 20   this pager. If 
17330 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
17340 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
17350 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
17360 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
17370 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
17380 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74 6f 72  modified (restor
17390 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  ed).** as part o
173a0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
173b0 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
173c0 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62  lback. The callb
173d0 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20 68 69  ack gives .** hi
173e0 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20  gher-level code 
173f0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
17400 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
17410 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a  TRA section to .
17420 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20 74 68  ** agree with th
17430 65 20 72 65 73 74 6f 72 65 64 20 70 61 67 65 20  e restored page 
17440 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
17450 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
17460 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
17470 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
17480 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a  nit)(DbPage*)){.
17490 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
174a0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
174b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
174c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
174d0 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
174e0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
174f0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
17500 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
17510 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17520 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
17530 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
17540 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17550 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
17560 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
17570 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
17580 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
17590 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
175a0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
175d0 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
175e0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
175f0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
17600 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
17610 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
17620 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
17630 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
17640 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
17650 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
17660 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
17670 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
17680 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
17690 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
176a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
176b0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
176c0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
176d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
176e0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
176f0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
17700 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
17710 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
17720 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
17730 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
17740 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
17750 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
17760 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
17770 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
17780 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17790 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
177a0 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
177b0 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
177c0 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
177d0 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
177e0 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
177f0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
17800 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
17810 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
17820 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
17830 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
17840 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
17850 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
17860 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
17870 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
17880 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
17890 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
178a0 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
178b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
178c0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
178d0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
178e0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
178f0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
17900 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
17910 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
17920 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17930 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
17940 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
17950 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
17960 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
17970 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
17980 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
17990 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
179a0 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
179b0 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
179c0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
179d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
179e0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
179f0 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
17a00 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
17a10 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
17a20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
17a30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
17a40 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
17a50 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
17a60 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
17a70 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
17a80 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
17a90 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
17aa0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
17ab0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
17ac0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
17ad0 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
17ae0 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
17af0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
17b00 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
17b10 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
17b20 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
17b30 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
17b40 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
17b50 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
17b60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
17b70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
17b80 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
17b90 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
17ba0 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
17bb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17bc0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
17be0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
17bf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
17c00 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
17c10 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
17c20 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
17c30 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
17c40 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
17c50 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
17c60 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61  Size!=pPager->pa
17c70 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20  geSize .     && 
17c80 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
17c90 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
17ca0 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
17cb0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
17cc0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
17cd0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
17ce0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
17cf0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
17d00 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
17d10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17d20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
17d30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17d40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
17d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
17d60 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17d70 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
17d80 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
17d90 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73  eSize;.        s
17da0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
17db0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17dc0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
17dd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
17de0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
17df0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
17e00 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
17e10 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
17e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17e30 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
17e40 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61   (u16)pPager->pa
17e50 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  geSize;.    if( 
17e60 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
17e70 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
17e80 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
17e90 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
17ea0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
17eb0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
17ec0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
17ed0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
17ee0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17ef0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17f00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17f10 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
17f20 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
17f30 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
17f40 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
17f50 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
17f60 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
17f70 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
17f80 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
17f90 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
17fa0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
17fb0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
17fc0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
17fd0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
17fe0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
17ff0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
18000 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
18010 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
18020 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
18030 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
18040 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
18050 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
18060 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
18070 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
18080 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
18090 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
180a0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
180b0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
180c0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
180d0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
180e0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
180f0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
18100 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
18110 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
18120 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
18130 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
18140 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
18150 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
18160 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
18170 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
18180 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
18190 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
181a0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
181b0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
181c0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
181d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
181e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
181f0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
18200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
18210 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
18220 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
18230 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
18240 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
18250 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18260 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
18270 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
18280 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
18290 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
182a0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
182b0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
182c0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
182d0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
182e0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
182f0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
18300 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
18310 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
18320 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
18330 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
18340 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
18350 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
18360 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
18370 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
18380 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
18390 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
183a0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
183b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
183c0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
183d0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
183e0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
183f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
18400 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
18410 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
18420 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
18430 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
18440 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
18450 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
18460 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
18470 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
18480 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
18490 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_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 71 6c 69 74 65 33  void){.  sqlite3
184c0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
184d0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
184e0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
184f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
18500 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
18510 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
18520 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
18530 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
18540 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
18550 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
18560 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
18570 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
18580 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
18590 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
185a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
185b0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
185c0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
185d0 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
185e0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
185f0 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
18600 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
18610 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
18620 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
18630 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
18640 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
18650 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
18660 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
18670 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
18680 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
18690 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
186a0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
186b0 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
186c0 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
186d0 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
186e0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
186f0 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
18700 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
18710 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
18720 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
18730 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
18740 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
18750 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18760 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
18770 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
18780 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
18790 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
187a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
187b0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
187c0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
187d0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
187e0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
187f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18800 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
18810 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
18820 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
18830 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
18840 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18850 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
18860 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
18870 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
18880 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
18890 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
188a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
188b0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
188c0 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
188d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
188e0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
188f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
18900 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18910 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18920 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18930 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
18940 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
18960 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
18970 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61  th pPager. Norma
18980 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c  lly, this is cal
18990 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20  culated as (<db 
189a0 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65  file size>/<page
189b0 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65  -size>)..** Howe
189c0 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
189d0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
189e0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
189f0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
18a00 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
18a10 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
18a20 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
18a30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
18a40 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
18a50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18a60 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
18a70 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61  the.** error sta
18a80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
18a90 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
18aa0 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61  nPage left uncha
18ab0 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  nged. Or,.** if 
18ac0 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
18ad0 68 61 73 20 74 6f 20 62 65 20 71 75 65 72 69 65  has to be querie
18ae0 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  d for the size o
18af0 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a  f the file and.*
18b00 2a 20 74 68 65 20 71 75 65 72 79 20 61 74 74 65  * the query atte
18b10 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49  mpt returns an I
18b20 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20  O error, the IO 
18b30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18b40 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
18b50 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
18b60 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  changed..**.** O
18b70 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65  therwise, if eve
18b80 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
18b90 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49  ssful, then SQLI
18ba0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18bb0 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65  d.** and *pnPage
18bc0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
18bd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
18be0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
18bf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18c00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
18c10 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
18c20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
18c30 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
18c40 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
18c50 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
18c60 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  Page */..  /* If
18c70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
18c80 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
18c90 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
18ca0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
18cb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
18cc0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
18cd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18ce0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
18cf0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
18d00 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18d10 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53 74   in the file. St
18d20 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61 67  ore this in nPag
18d30 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
18d40 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
18d50 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  ){.    nPage = p
18d60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
18d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18d80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18d90 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 74      /* Error ret
18da0 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
18db0 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36 34  ize() */.    i64
18dc0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
18dd0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a       /* File siz
18de0 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75 72  e in bytes retur
18df0 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a  ned by OsFileSiz
18e00 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e() */..    asse
18e10 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
18e20 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
18e30 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
18e40 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18e50 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30 20 21  ger->fd) && (0 !
18e60 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
18e70 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
18e80 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20  ->fd, &n))) ){. 
18e90 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
18ea0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
18eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
18ed0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
18ee0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
18ef0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nPage = 1;.    }
18f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
18f10 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
18f20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
18f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18f40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
18f50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
18f60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
18f70 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
18f80 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
18f90 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
18fa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
18fb0 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
18fc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
18fd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
18fe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18ff0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
19000 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
19010 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
19020 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
19030 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
19040 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
19050 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
19060 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
19070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
19080 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
19090 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
190a0 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
190b0 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
190c0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
190d0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
190e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
190f0 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
19100 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
19110 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
19120 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19130 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
19140 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19150 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
19160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19170 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
19180 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
19190 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
191a0 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
191b0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
191c0 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
191d0 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
191e0 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
191f0 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
19200 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
19210 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
19220 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
19230 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
19240 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
19250 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
19260 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
19270 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
19280 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
19290 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
192a0 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
192b0 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
192c0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
192d0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
192e0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
192f0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
19300 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
19310 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
19320 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
19330 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
19340 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
19350 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
19360 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
19370 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
19380 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
19390 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
193a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
193b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
193c0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
193d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
19400 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  e */..  /* The O
19410 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
19420 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
19430 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
19440 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
19450 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
19460 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
19470 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
19480 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
19490 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
194a0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
194b0 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
194c0 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
194d0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
194e0 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
194f0 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
19500 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
19510 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
19520 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
19530 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
19540 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
19550 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
19560 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
19570 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
19580 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
19590 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
195a0 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
195b0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
195c0 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
195d0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
195e0 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
195f0 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
19600 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
19610 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
19620 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
19630 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
19640 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
19650 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
19660 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
19670 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  || (pPager->stat
19680 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
19690 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47  && locktype==PAG
196a0 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
196b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
196c0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
196d0 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  VED && locktype=
196e0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
196f0 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ).  );..  if( pP
19700 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
19710 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
19720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
19730 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
19740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19750 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
19760 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
19770 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
19780 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
19790 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
197a0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
197b0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
197c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
197d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
197e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75  ager->state = (u
197f0 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  8)locktype;.    
19800 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
19810 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
19820 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
19830 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
19850 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
19860 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
19870 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
19880 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
19890 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
198a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
198b0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
198c0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
198d0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
198e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
198f0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
19900 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
19910 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
19920 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
19930 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
19940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
19950 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
19960 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
19970 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
19980 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19990 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
199a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
199b0 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Valid );.  asser
199c0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
199d0 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
199e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
199f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
19a00 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  VED );.  pPager-
19a10 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
19a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
19a30 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
19a40 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
19a50 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
19a60 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
19a70 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
19a80 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
19a90 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
19aa0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
19ab0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
19ac0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
19ad0 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
19ae0 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
19af0 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
19b00 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
19b10 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
19b20 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
19b30 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
19b40 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
19b50 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
19b60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
19b70 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
19b80 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
19b90 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
19ba0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
19bb0 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
19bc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
19bd0 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
19be0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
19bf0 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
19c00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
19c10 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
19c20 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
19c30 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
19c40 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
19c50 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
19c60 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
19c70 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
19c90 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
19ca0 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62 6c 65  ager){.  disable
19cb0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
19cc0 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
19cd0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
19ce0 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
19cf0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
19d00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
19d10 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
19d20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
19d30 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
19d40 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
19d50 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
19d60 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61  e{.    /* Set Pa
19d70 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  ger.journalHdr t
19d80 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e  o -1 for the ben
19d90 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67 65  efit of the page
19da0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20  r_playback() .  
19db0 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20    ** call which 
19dc0 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d  may be made from
19dd0 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c   within pagerUnl
19de0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29  ockAndRollback()
19df0 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69  . If it.    ** i
19e00 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74  s not -1, then t
19e10 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  he unsynced port
19e20 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a  ion of an open j
19e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a  ournal file may.
19e40 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64      ** be played
19e50 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
19e60 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
19e70 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
19e80 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  rs while.    ** 
19e90 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
19ea0 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
19eb0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  may become corru
19ec0 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  pt..    */.    p
19ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
19ee0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67 65  r = -1;.    page
19ef0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
19f00 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
19f10 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
19f20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
19f30 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
19f40 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
19f50 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
19f60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19f70 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
19f80 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
19f90 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
19fa0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
19fb0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
19fc0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
19fd0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
19fe0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19ff0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
1a000 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
1a010 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1a020 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
1a030 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
1a040 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
1a050 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
1a060 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1a070 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
1a080 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
1a090 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1a0a0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1a0b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
1a0c0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
1a0d0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
1a0e0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1a0f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
1a100 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
1a110 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
1a120 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1a130 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1a140 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
1a150 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
1a160 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
1a170 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
1a180 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
1a190 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
1a1a0 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
1a1b0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
1a1c0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1a1d0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
1a1e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1a1f0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
1a200 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
1a210 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
1a220 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1a230 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
1a240 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
1a250 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
1a260 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
1a270 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1a280 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
1a290 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
1a2a0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
1a2b0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1a2c0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1a2d0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1a2e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1a2f0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
1a300 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1a310 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20  ync flag is not 
1a320 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
1a330 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20  unction is a.** 
1a340 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1a350 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
1a360 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
1a370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
1a380 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76  e.** and the dev
1a390 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1a3a0 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
1a3b0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
1a3c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1a3d0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1a3e0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
1a3f0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1a400 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
1a410 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
1a420 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
1a430 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1a440 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1a450 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
1a460 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1a470 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
1a480 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
1a490 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1a4a0 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
1a4b0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
1a4c0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
1a4d0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1a4e0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
1a4f0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
1a500 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
1a510 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
1a520 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1a530 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
1a540 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
1a550 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1a560 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1a570 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
1a580 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
1a590 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
1a5a0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1a5b0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1a5c0 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
1a5d0 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
1a5e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a5f0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
1a600 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
1a610 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
1a620 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
1a630 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
1a640 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
1a650 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
1a660 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
1a670 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
1a680 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
1a690 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
1a6a0 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
1a6b0 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
1a6c0 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
1a6d0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1a6e0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
1a6f0 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e  **.** The Pager.
1a700 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1a710 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f   never be set fo
1a720 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a730 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c  s, or any.** fil
1a740 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e  e operating in n
1a750 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67  o-sync mode (Pag
1a760 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f  er.noSync set to
1a770 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a   non-zero)..**.*
1a780 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1a790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
1a7a0 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
1a7b0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
1a7c0 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
1a7d0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
1a7e0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
1a7f0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1a800 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
1a810 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1a820 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
1a830 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1a840 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1a850 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1a860 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
1a870 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1a880 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1a890 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1a8a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1a8b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1a8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1a8d0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1a8e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1a8f0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
1a900 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1a930 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1a940 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1a950 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1a960 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1a970 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
1a980 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1a990 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
1a9a0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1a9b0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1a9c0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
1a9d0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
1a9e0 4e 52 65 63 4f 66 66 73 65 74 20 69 73 20 73 65  NRecOffset is se
1a9f0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
1aa00 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1aa10 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ile.        ** o
1aa20 66 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  f the nRec field
1aa30 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1aa40 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
1aa50 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1aa60 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 66 69        ** This fi
1aa70 65 6c 64 20 77 69 6c 6c 20 62 65 20 75 70 64 61  eld will be upda
1aa80 74 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ted following th
1aa90 65 20 78 53 79 6e 63 28 29 20 6f 70 65 72 61 74  e xSync() operat
1aaa0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ion.        ** o
1aab0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1aac0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  le. */.        i
1aad0 36 34 20 69 4e 52 65 63 4f 66 66 73 65 74 20 3d  64 iNRecOffset =
1aae0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1aaf0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
1ab00 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 0a 20 20  urnalMagic);..  
1ab10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
1ab20 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
1ab30 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
1ab40 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
1ab50 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
1ab60 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
1ab70 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1ab80 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
1ab90 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
1aba0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1abb0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1abc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
1abd0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
1abe0 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
1abf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
1ac00 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1ac10 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
1ac20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
1ac30 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1ac40 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
1ac50 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
1ac60 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
1ac70 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
1ac80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
1ac90 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ious connections
1aca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
1acb0 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
1acc0 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
1acd0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
1ace0 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
1acf0 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
1ad00 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1ad10 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
1ad20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
1ad30 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1ad40 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
1ad50 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
1ad60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
1ad70 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
1ad80 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
1ad90 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
1ada0 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
1adb0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
1adc0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1add0 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
1ade0 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
1adf0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
1ae00 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ae10 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
1ae20 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
1ae30 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
1ae40 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
1ae50 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
1ae60 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
1ae70 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1ae80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ae90 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
1aea0 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1aec0 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
1aed0 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
1aee0 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
1aef0 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
1af00 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
1af10 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
1af20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
1af30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
1af40 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
1af50 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
1af60 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
1af70 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
1af80 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
1af90 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
1afa0 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
1afb0 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
1afc0 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
1afd0 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
1afe0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
1aff0 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
1b000 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
1b010 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
1b020 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
1b030 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
1b040 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
1b050 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
1b060 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
1b070 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1b080 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
1b090 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1b0a0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1b0b0 29 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  );.        u8 aM
1b0c0 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
1b0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1b0e0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
1b0f0 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
1b100 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1b110 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b120 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
1b130 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
1b140 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
1b150 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
1b160 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
1b170 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
1b180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b190 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
1b1a0 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
1b1b0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
1b1c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b1d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b1e0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1b1f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b200 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1b210 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b220 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b230 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
1b240 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
1b250 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1b260 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
1b270 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
1b280 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
1b290 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1b2a0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
1b2b0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
1b2c0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
1b2d0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
1b2e0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
1b2f0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
1b300 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
1b310 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
1b320 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
1b330 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1b340 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
1b350 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
1b360 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
1b370 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
1b380 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
1b390 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
1b3a0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
1b3b0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
1b3c0 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
1b3d0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
1b3e0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
1b3f0 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
1b400 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
1b410 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
1b420 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
1b430 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
1b440 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b450 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
1b460 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
1b470 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1b480 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
1b490 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1b4a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1b4b0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1b4c0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1b4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
1b4e0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1b4f0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1b500 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b510 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
1b520 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1b530 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1b540 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1b550 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1b560 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1b570 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
1b580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b590 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b5a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1b5b0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
1b5c0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
1b5d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 69  %d\n", pPager, i
1b5e0 4e 52 65 63 4f 66 66 73 65 74 2c 20 34 29 29 3b  NRecOffset, 4));
1b5f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
1b600 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1b610 2d 3e 6a 66 64 2c 20 69 4e 52 65 63 4f 66 66 73  ->jfd, iNRecOffs
1b620 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  et, pPager->nRec
1b630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b660 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1b670 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1b680 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1b690 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b6a0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b6b0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b6c0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b6d0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b6e0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b6f0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1b700 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1b710 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1b720 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b730 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1b740 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b750 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1b760 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1b770 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1b780 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1b790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b7a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b7b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b7c0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1b7d0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1b7e0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1b7f0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1b800 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1b810 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1b820 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1b830 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1b840 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1b850 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1b860 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1b870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1b880 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  ted = 1;.    sql
1b890 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1b8a0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1b8b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1b8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b8d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1b8e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b8f0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1b900 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1b910 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1b920 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1b930 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1b940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b950 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1b960 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1b970 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1b980 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1b990 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1b9a0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1b9b0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1b9c0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1b9d0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1b9e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b9f0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1ba00 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1ba10 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1ba20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1ba30 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1ba40 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1ba50 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1ba60 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1ba70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1ba80 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1ba90 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1baa0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1bab0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1bac0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1bad0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1bae0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1baf0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1bb00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bb10 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1bb20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1bb30 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1bb40 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1bb50 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1bb60 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1bb70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1bb80 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1bb90 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1bba0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1bbb0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1bbc0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1bbd0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1bbe0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1bbf0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1bc00 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1bc10 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1bc20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1bc30 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1bc40 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1bc50 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1bc60 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1bc70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1bc80 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1bc90 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1bca0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1bcb0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1bcc0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1bcd0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1bce0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1bcf0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1bd00 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1bd10 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1bd20 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1bd30 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1bd40 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1bd50 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1bd60 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1bd70 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1bd80 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1bd90 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1bda0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1bdb0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1bdc0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1bdd0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1bde0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1bdf0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1be00 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1be10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1be20 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1be30 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1be40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1be50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1be60 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1be70 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1be80 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1be90 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1bea0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1beb0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1bec0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1bed0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1bee0 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1bf10 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bf40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1bf50 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1bf60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf70 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
1bf80 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
1bf90 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
1bfa0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
1bfb0 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
1bfc0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1bfd0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
1bfe0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1bff0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c000 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1c010 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
1c020 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20  .  ** call is a 
1c030 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
1c040 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
1c050 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
1c060 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
1c070 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
1c080 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
1c090 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
1c0a0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
1c0b0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
1c0c0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
1c0d0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
1c0e0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
1c0f0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
1c100 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
1c110 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
1c120 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
1c130 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
1c140 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
1c150 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
1c160 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
1c170 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
1c180 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
1c190 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
1c1a0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
1c1b0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
1c1c0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
1c1d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1c1e0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
1c1f0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
1c200 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
1c210 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1c220 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
1c230 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
1c240 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1c250 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
1c260 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
1c270 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
1c280 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
1c290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c2a0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
1c2b0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
1c2c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
1c2d0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
1c2e0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73  yback..  */.  as
1c2f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c300 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1c310 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  VED );.  rc = pa
1c320 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1c330 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1c340 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
1c350 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
1c360 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
1c370 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
1c380 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
1c390 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
1c3a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
1c3b0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
1c3c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1c3d0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
1c3e0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
1c3f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
1c400 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1c410 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
1c420 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
1c430 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1c440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c450 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
1c460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1c470 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
1c480 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1c490 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1c4a0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
1c4b0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1c4c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
1c4d0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
1c4e0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
1c4f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1c500 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
1c510 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
1c520 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
1c530 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
1c540 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1c550 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
1c560 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
1c570 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
1c580 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
1c590 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
1c5a0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
1c5b0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
1c5c0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
1c5d0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
1c5e0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
1c5f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
1c600 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
1c610 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
1c620 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
1c630 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
1c640 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
1c650 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
1c660 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c670 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
1c680 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1c690 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1c6a0 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1c6b0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1c6c0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1c6d0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1c6e0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1c6f0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1c700 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c710 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c720 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
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 2f 2a 20 44 61 74 61 20          /* Data 
1c750 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1c760 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1c770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1c780 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1c790 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c7a0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1c7b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c7c0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1c7d0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1c7e0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1c7f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c800 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c810 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1c820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c830 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1c840 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1c850 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1c860 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1c870 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1c880 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1c890 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1c8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8b0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1c8c0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1c8d0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1c8e0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1c8f0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1c900 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1c910 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1c920 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1c930 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c940 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1c950 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1c960 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c980 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1c990 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1c9a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c9b0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1c9c0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1c9d0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1c9e0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1c9f0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1ca00 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1ca10 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1ca20 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1ca30 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1ca40 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1ca50 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1ca60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1ca70 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1ca80 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cab0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1cac0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1cad0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1cae0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1caf0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1cb00 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1cb10 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1cb20 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1cb30 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1cb40 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1cb50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cb60 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1cb70 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1cb80 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1cb90 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1cba0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1cbb0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1cbc0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1cbd0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1cbe0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1cbf0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1cc00 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1cc10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1cc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1cc30 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1cc40 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1cc50 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1cc60 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1cc70 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1cc80 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1cc90 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1cca0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1ccb0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1ccc0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1ccd0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1cce0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ccf0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1cd00 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1cd10 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1cd20 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1cd30 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1cd40 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1cd50 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1cd60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1cd70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cd80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cd90 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1cda0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1cdb0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1cdc0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1cdd0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1cde0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1cdf0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1ce00 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1ce10 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1ce20 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1ce30 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1ce40 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1ce50 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1ce60 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1ce70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ce80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ce90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1cea0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1ceb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1cec0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1ced0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1cee0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1cef0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1cf00 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1cf10 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1cf20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1cf30 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1cf40 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1cf50 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1cf60 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1cf70 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1cf80 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1cf90 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1cfa0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1cfb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1cfc0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1cfd0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1cfe0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1cff0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1d000 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1d010 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1d020 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1d030 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d050 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d060 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1d070 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1d080 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1d090 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1d0a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1d0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d0c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1d0d0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1d0e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1d0f0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1d100 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1d110 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1d120 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1d130 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d160 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1d170 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d180 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
1d190 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
1d1a0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
1d1b0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
1d1c0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
1d1d0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1d1e0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
1d1f0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
1d200 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
1d210 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
1d220 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
1d230 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
1d240 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
1d250 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d260 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
1d270 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
1d280 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
1d290 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
1d2a0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1d2b0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
1d2c0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
1d2d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d2e0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1d2f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1d300 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
1d310 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
1d320 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1d330 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
1d340 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
1d350 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
1d360 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
1d370 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
1d380 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
1d390 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
1d3a0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
1d3b0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
1d3c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
1d3d0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d3e0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
1d3f0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
1d400 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
1d410 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1d420 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d430 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
1d440 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
1d450 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
1d460 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d470 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
1d480 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
1d490 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
1d4a0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
1d4b0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1d4c0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
1d4d0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1d4e0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
1d4f0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1d500 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
1d510 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d520 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
1d530 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1d540 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d550 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
1d560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d570 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
1d580 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
1d590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1d5a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
1d5b0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
1d5c0 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1d5d0 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71  is set by the sq
1d5e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d5f0 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  ) function while
1d600 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72   it.  ** is jour
1d610 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66  nalling a set of
1d620 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74   two or more dat
1d630 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
1d640 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a   are stored.  **
1d650 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
1d660 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e  k sector. Syncin
1d670 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  g the journal is
1d680 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69   not allowed whi
1d690 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  le.  ** this is 
1d6a0 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
1d6b0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1d6c0 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
1d6d0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74   such a.  ** set
1d6e0 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79   of pages are sy
1d6f0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67  nced to disk tog
1d700 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68  ether. So, if th
1d710 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63  e page this func
1d720 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79  tion.  ** is try
1d730 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61  ing to make clea
1d740 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  n will require a
1d750 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e   journal sync an
1d760 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a  d the doNotSync.
1d770 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
1d780 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1d790 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
1d7a0 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   The pcache laye
1d7b0 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74  r will.  ** just
1d7c0 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61   have to go ahea
1d7d0 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  d and allocate a
1d7e0 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72   new page buffer
1d7f0 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
1d800 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20   reusing pPg..  
1d810 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  **.  ** Similarl
1d820 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20  y, if the pager 
1d830 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
1d840 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
1d850 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a  ate, do not.  **
1d860 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
1d870 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
1d880 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  g to disk..  */.
1d890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d8a0 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
1d8b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
1d8c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d8d0 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20  NEED_SYNC) ){.  
1d8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d8f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79  OK;.  }..  /* Sy
1d900 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1d910 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
1d920 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
1d930 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d940 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  SYNC ){.    rc =
1d950 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1d960 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d980 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1d990 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67  && .      !(pPag
1d9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1d9b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1d9c0 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
1d9d0 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
1d9e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1d9f0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1da00 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1da10 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29  FE_APPEND).    )
1da20 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1da30 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1da40 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1da50 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1da60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1da70 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1da80 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
1da90 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1daa0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1dab0 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1dac0 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
1dad0 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
1dae0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
1daf0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69  ournal..  ** Thi
1db00 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
1db10 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
1db20 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
1db30 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
1db40 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
1db50 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
1db60 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
1db70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73  ..  **.  ** Cons
1db80 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1db90 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
1dba0 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  vents:.  **.  **
1dbb0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
1dbc0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
1dbd0 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f   X>.  **     <mo
1dbe0 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a  dify page X>.  *
1dbf0 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
1dc00 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  sp;.  **       <
1dc10 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
1dc20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
1dc30 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65  .  **       page
1dc40 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
1dc50 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
1dc60 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20  K TO sp;.  **.  
1dc70 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
1dc80 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
1dc90 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
1dca0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
1dcb0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74  written.  ** out
1dcc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1dcd0 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
1dce0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
1dcf0 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
1dd00 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
1dd10 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1dd20 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
1dd30 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
1dd40 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61  ill read.  ** da
1dd50 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
1dd60 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
1dd70 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
1dd80 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
1dd90 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74  .  ** was when t
1dda0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1ddb0 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
1ddc0 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
1ddd0 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77  POINT sp".  ** w
1dde0 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  as executed..  *
1ddf0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74  *.  ** The solut
1de00 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
1de10 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1de20 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
1de30 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
1de40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
1de50 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1de60 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
1de70 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
1de80 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
1de90 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
1dea0 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
1deb0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
1dec0 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e   .  ** executed.
1ded0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1dee0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
1def0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1df00 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
1df10 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1df20 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
1df30 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1df40 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1df50 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1df60 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1df70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1df80 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1df90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dfa0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1dfb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1dfc0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1dfd0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
1dfe0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1dff0 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
1e000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e010 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
1e020 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
1e030 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1e040 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1e050 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
1e060 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1e070 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
1e080 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1e090 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1e0a0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
1e0b0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1e0c0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
1e0d0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
1e0e0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
1e0f0 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
1e100 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
1e110 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
1e120 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
1e130 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1e140 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
1e150 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1e160 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
1e170 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
1e180 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
1e190 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
1e1a0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
1e1b0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
1e1c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1e1d0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
1e1e0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
1e1f0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
1e200 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
1e210 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
1e220 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1e230 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
1e240 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
1e250 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
1e260 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
1e270 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
1e280 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
1e290 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
1e2a0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
1e2b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1e2c0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
1e2d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1e2e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
1e2f0 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
1e300 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
1e310 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1e320 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
1e330 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1e340 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1e350 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
1e360 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
1e370 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
1e380 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1e390 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
1e3a0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
1e3b0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
1e3c0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
1e3d0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
1e3e0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
1e3f0 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
1e400 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
1e410 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
1e420 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
1e430 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
1e440 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
1e450 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
1e460 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
1e470 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
1e480 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
1e490 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
1e4a0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
1e4b0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
1e4c0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
1e4d0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
1e4e0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
1e4f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1e500 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
1e510 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
1e520 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
1e530 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
1e540 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
1e550 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e560 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
1e570 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
1e580 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
1e590 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1e5a0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
1e5b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1e5c0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
1e5d0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
1e5e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1e5f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
1e600 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
1e610 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
1e620 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
1e630 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1e640 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
1e650 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
1e660 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
1e670 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
1e680 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e690 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
1e6a0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
1e6b0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
1e6c0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
1e6d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1e6e0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
1e6f0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
1e700 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1e710 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1e720 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1e730 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1e740 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
1e750 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
1e760 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
1e770 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
1e780 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
1e790 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7b0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
1e7c0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
1e7d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
1e7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e7f0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1e800 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
1e810 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
1e820 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
1e830 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
1e840 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e850 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
1e860 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
1e870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e880 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1e890 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e8a0 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
1e8b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e8c0 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
1e8d0 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
1e8e0 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
1e8f0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
1e900 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e910 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1e920 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1e930 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
1e940 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e950 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
1e960 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
1e970 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
1e980 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
1e990 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e9a0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e9b0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e9c0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
1e9d0 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
1e9e0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1e9f0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
1ea00 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1ea10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ea20 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
1ea30 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
1ea40 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
1ea50 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
1ea60 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
1ea70 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
1ea80 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
1ea90 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
1eaa0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
1eab0 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
1eac0 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
1ead0 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
1eae0 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
1eaf0 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
1eb00 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1eb10 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
1eb20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
1eb30 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
1eb40 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1eb50 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
1eb60 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
1eb70 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1eb80 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
1eb90 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
1eba0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1ebb0 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
1ebc0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
1ebd0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1ebe0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
1ebf0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
1ec00 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
1ec10 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
1ec20 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
1ec30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1ec40 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
1ec50 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
1ec60 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
1ec70 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
1ec80 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
1ec90 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
1eca0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
1ecb0 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
1ecc0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
1ecd0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
1ece0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
1ecf0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1ed00 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1ed10 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
1ed20 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
1ed30 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
1ed40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
1ed50 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1ed60 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
1ed70 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
1ed80 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ed90 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1eda0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1edb0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1edc0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1edd0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1ede0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1edf0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
1ee00 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1ee10 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
1ee20 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
1ee30 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
1ee40 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
1ee50 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
1ee60 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
1ee70 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
1ee80 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
1ee90 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
1eea0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
1eeb0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
1eec0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
1eed0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
1eee0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
1eef0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
1ef00 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
1ef10 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1ef20 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1ef30 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
1ef40 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
1ef50 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
1ef60 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1ef70 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
1ef80 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
1ef90 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
1efa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1efb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
1efc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1efd0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
1efe0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1eff0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
1f000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
1f010 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
1f020 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
1f030 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1f040 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
1f050 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
1f060 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
1f070 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
1f080 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
1f090 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
1f0a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
1f0b0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
1f0c0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
1f0d0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
1f0e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
1f0f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
1f100 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
1f110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1f120 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
1f130 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
1f140 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
1f150 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
1f160 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
1f170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
1f180 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1f190 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1f1a0 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
1f1b0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
1f1c0 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
1f1d0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
1f1e0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
1f1f0 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
1f200 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
1f210 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
1f220 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
1f230 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
1f240 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1f250 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
1f260 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
1f270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
1f280 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
1f290 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1f2a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f2c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f2e0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f310 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1f320 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
1f330 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
1f340 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
1f350 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
1f360 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
1f370 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1f380 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
1f390 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
1f3a0 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
1f3b0 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
1f3c0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1f3d0 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
1f400 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
1f410 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
1f440 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
1f450 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1f460 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1f470 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
1f480 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
1f490 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
1f4a0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1f4b0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1f4c0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1f4d0 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
1f4e0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1f4f0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
1f500 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f510 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1f520 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
1f530 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
1f540 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
1f550 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
1f560 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
1f570 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1f580 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
1f590 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
1f5a0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1f5b0 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
1f5c0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
1f5d0 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
1f5e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
1f5f0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
1f600 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
1f610 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
1f620 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f630 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
1f640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
1f650 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
1f660 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1f670 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
1f680 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
1f690 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
1f6a0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
1f6b0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
1f6c0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1f6d0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f6e0 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1f6f0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
1f700 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
1f710 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f720 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
1f730 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
1f740 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
1f750 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
1f760 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f770 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
1f780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f790 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
1f7a0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
1f7b0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
1f7c0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1f7d0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
1f7e0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
1f7f0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
1f800 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
1f810 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1f820 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f830 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
1f840 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
1f850 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f860 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f870 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
1f880 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
1f890 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
1f8a0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1f8b0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
1f8c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f8d0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
1f8e0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
1f8f0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
1f900 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f910 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
1f920 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
1f930 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f940 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f950 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f960 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f970 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f980 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f990 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f9a0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f9b0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f9c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f9d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f9e0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f9f0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1fa00 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1fa10 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1fa20 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1fa30 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1fa40 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1fa50 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1fa60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1fa70 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1fa80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
1fa90 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
1faa0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
1fab0 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
1fac0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
1fad0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1fae0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1faf0 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
1fb00 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
1fb10 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1fb30 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
1fb40 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
1fb50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fb60 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1fb70 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1fb80 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
1fb90 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
1fba0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
1fbb0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1fbc0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
1fbd0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1fbe0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
1fbf0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
1fc00 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
1fc10 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
1fc20 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
1fc30 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
1fc40 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
1fc50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1fc60 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
1fc70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
1fc80 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
1fc90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
1fca0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1fcb0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
1fcc0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
1fcd0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1fce0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
1fcf0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1fd00 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
1fd10 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
1fd20 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
1fd30 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1fd40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fd50 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
1fd60 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
1fd70 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
1fd80 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1fd90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fda0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
1fdb0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fdc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
1fdd0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
1fde0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
1fdf0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1fe00 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
1fe10 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1fe20 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
1fe30 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1fe40 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
1fe50 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fe60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1fe70 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
1fe80 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61  eDflt = (u16)pPa
1fe90 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
1fea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1feb0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1fec0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1fed0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
1fee0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
1fef0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1ff00 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1ff10 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1ff20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1ff30 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1ff40 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1ff50 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
1ff60 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1ff70 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
1ff80 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
1ff90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ffa0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1ffb0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
1ffc0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
1ffd0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
1ffe0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
1fff0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
20000 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
20010 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
20020 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20030 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
20040 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
20050 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
20060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20070 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
20080 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
20090 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
200a0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
200b0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
200c0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
200d0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
200e0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
200f0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
20100 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
20110 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
20120 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
20130 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
20140 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
20150 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
20160 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
20170 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
20180 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
20190 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
201a0 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
201b0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
201c0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
201d0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
201e0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
201f0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
20200 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
20210 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
20220 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
20230 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
20240 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
20250 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
20260 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  E;.    readOnly 
20270 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
20280 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
20290 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
202a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
202b0 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
202c0 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
202d0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
202e0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
202f0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
20300 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
20310 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
20320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
20330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20350 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
20360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20370 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
20380 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
20390 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
203a0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
203b0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
203c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
203d0 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
203e0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
203f0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
20400 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
20410 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
20420 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
20430 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20440 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
20450 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
20460 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
20470 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
20480 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
20490 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
204a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
204b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
204c0 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
204d0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73  object. */.  ass
204e0 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
204f0 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52   );.  nExtra = R
20500 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
20510 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
20520 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
20530 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
20560 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
20570 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
20580 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41  >pPCache);..  PA
20590 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
205a0 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
205b0 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
205c0 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
205d0 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
205e0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
205f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
20600 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
20610 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
20620 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
20630 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
20640 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  ->noReadlock = (
20650 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
20660 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20  adOnly) ?1:0;.  
20670 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
20680 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
20690 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
206a0 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
206b0 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
206c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
206d0 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38  bSizeValid = (u8
206e0 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61  )memDb;.  /* pPa
206f0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
20700 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20710 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
20720 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20730 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
20740 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20750 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
20760 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
20770 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20780 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
20790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
207a0 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
207b0 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
207c0 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
207d0 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70  NLOCK) );.  /* p
207e0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
207f0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20800 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
20810 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
20820 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
20830 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
20840 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
20850 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
20860 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
20870 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
20880 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
20890 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
208a0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
208b0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
208c0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
208d0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
208e0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
208f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20900 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
20910 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
20920 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
20930 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
20940 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
20950 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
20960 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20970 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = (pPager->tempF
20980 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
20990 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  al) ?1:0;.  pPag
209a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
209b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
209c0 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
209d0 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
209e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
209f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
20a00 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
20a10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
20a20 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
20a30 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
20a40 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20a50 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
20a60 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
20a70 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
20a80 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
20a90 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
20aa0 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
20ab0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20ac0 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
20ad0 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
20ae0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
20af0 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
20b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20b10 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20b20 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
20b30 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
20b40 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
20b50 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20b60 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
20b70 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  rg = 0; */.  /* 
20b80 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
20b90 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
20ba0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
20bb0 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
20bc0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
20bd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20be0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20bf0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20c00 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
20c10 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
20c20 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
20c30 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
20c40 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
20c50 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
20c60 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
20c70 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
20c80 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
20c90 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
20ca0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
20cb0 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
20cc0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
20cd0 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
20ce0 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
20cf0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
20d00 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
20d10 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
20d20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
20d30 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
20d40 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
20d50 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
20d60 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
20d70 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
20d80 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
20d90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20da0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
20db0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
20dc0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
20dd0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20de0 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
20df0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
20e00 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
20e10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
20e20 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
20e30 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
20e40 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
20e50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20e60 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
20e70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
20e80 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
20e90 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
20ea0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
20eb0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
20ec0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
20ed0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
20ee0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
20ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20f00 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
20f10 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
20f20 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
20f30 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
20f40 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
20f50 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
20f60 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
20f70 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
20f80 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
20f90 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
20fa0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20fb0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
20fc0 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
20fd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20fe0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
20ff0 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
21000 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
21010 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
21020 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
21030 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
21040 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
21050 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
21060 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
21070 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
21080 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
21090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
210a0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
210b0 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
210c0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
210d0 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
210e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
210f0 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
21100 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
21110 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
21120 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21130 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
21140 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
21150 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
21160 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
21170 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21180 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
21190 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
211a0 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
211b0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
211c0 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
211d0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
211e0 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
211f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
21200 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
21210 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
21220 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
21230 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
21240 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
21250 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
21260 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21270 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
21280 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
21290 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
212a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
212b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
212c0 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20 20  int exists;     
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
212e0 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
212f0 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
21300 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
21310 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
21320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21330 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
21340 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
21350 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
21360 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
21370 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
21380 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
21390 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
213a0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
213b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
213c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
213d0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
213e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
213f0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
21400 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
21430 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
21440 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
21450 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
21460 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
21470 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
21480 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
21490 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
214a0 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
214b0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
214c0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
214d0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
214e0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
214f0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
21500 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
21510 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
21520 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
21530 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
21540 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
21550 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
21560 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
21570 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
21580 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
21590 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
215a0 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
215b0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
215c0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
215d0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
215e0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
215f0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
21600 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
21610 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
21620 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
21630 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
21640 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
21650 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
21660 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
21670 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
21680 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
21690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
216a0 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
216b0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
216c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
216d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
216e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
216f0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
21700 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
21710 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
21720 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21730 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
21740 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
21750 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
21760 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
21770 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
21780 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
21790 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
217a0 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
217b0 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
217c0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
217d0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
217e0 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
217f0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
21800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21810 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
21820 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21850 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21870 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
21880 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
21890 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
218a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
218b0 52 56 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  RVED.           
218c0 20 20 20 20 20 20 7c 7c 20 20 73 71 6c 69 74 65        ||  sqlite
218d0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
218e0 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
218f0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
21900 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21910 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
21920 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
21930 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
21940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
21950 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
21960 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
21970 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
21980 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
21990 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
219a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
219b0 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
219c0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
219d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
219e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
219f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
21a00 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
21a10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
21a40 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
21a50 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
21a60 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
21a70 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
21a80 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
21a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
21aa0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
21ab0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
21ac0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
21ad0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
21ae0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21af0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21b00 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
21b10 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
21b20 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
21b30 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
21b40 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
21b50 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
21b60 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
21b70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21b80 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
21b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21ba0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
21bb0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
21bc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21bd0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
21be0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21bf0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
21c00 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
21c10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21c20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21c30 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
21c40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21c50 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
21c60 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
21c70 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
21c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21ca0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
21cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21cd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21cf0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
21d00 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
21d10 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
21d20 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
21d30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
21d40 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
21d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21d60 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
21d70 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
21d80 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
21d90 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
21da0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
21db0 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
21dc0 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
21dd0 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
21de0 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
21df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21e00 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
21e10 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
21e20 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
21e30 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
21e40 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
21e50 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
21e60 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
21e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
21e80 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
21e90 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
21ea0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
21eb0 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
21ec0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
21ed0 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
21ee0 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
21ef0 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
21f00 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
21f10 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
21f20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
21f30 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
21f40 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
21f50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
21f60 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
21f70 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
21f80 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
21f90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21fa0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21fb0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
21fc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21fd0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
21fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22010 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
22020 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
22030 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
22040 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
22050 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
22060 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
22070 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
22080 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
22090 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
220a0 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
220b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
220c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
220d0 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
220e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
220f0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
22100 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
22110 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
22120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22130 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
22140 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
22150 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
22160 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
22170 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
22180 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
22190 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
221a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
221b0 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
221c0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
221d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
221e0 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
221f0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
22200 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
22210 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
22220 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
22230 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
22240 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
22250 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22270 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
22280 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
222a0 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
222b0 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
222c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
222d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
222e0 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
222f0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21  EMDB );..  if( !
22300 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
22310 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
22320 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
22330 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
22340 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
22350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
22380 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
22390 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
223a0 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
223b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
223c0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
223d0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
223e0 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
223f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22400 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
22410 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  EAD ){.    rc = 
22420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
22430 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
22440 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
22450 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
22460 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
22470 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
22480 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
22490 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
224a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
224b0 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
224c0 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
224d0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
224e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
224f0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
22500 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
22510 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
22520 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
22530 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
22540 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
22550 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
22560 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
22570 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
22580 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
22590 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
225a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
225b0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
225c0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
225d0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
225e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
225f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22600 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 75  d whenever the u
22610 70 70 65 72 20 6c 61 79 65 72 20 72 65 71 75 65  pper layer reque
22620 73 74 73 20 61 20 64 61 74 61 62 61 73 65 0a 2a  sts a database.*
22630 2a 20 70 61 67 65 20 69 73 20 72 65 71 75 65 73  * page is reques
22640 74 65 64 2c 20 62 65 66 6f 72 65 20 74 68 65 20  ted, before the 
22650 63 61 63 68 65 20 69 73 20 63 68 65 63 6b 65 64  cache is checked
22660 20 66 6f 72 20 61 20 73 75 69 74 61 62 6c 65 20   for a suitable 
22670 70 61 67 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64  page.** or any d
22680 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ata is read from
22690 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
226a0 74 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 66  t performs the f
226b0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20  ollowing.** two 
226c0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
226d0 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
226e0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
226f0 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  in PAGER_UNLOCK 
22700 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
22710 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
22720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22730 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
22740 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
22750 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
22760 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
22770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22780 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
22790 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
227a0 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
227b0 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
227c0 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
227d0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
227e0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
227f0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
22800 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
22810 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
22820 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
22830 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
22840 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
22850 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
22860 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
22870 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
22880 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
22890 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
228a0 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
228b0 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
228c0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
228d0 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
228e0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
228f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
22900 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
22910 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
22920 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
22930 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
22940 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
22950 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
22960 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
22970 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
22980 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
22990 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
229a0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
229b0 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
229c0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
229d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
229e0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
229f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
22a00 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
22a10 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
22a20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
22a30 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28  n described by (
22a40 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  2) above is not 
22a50 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69  attempted, and i
22a60 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69  f the.** pager i
22a70 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
22a80 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
22a90 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20  QLITE_FULL when 
22aa0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a  this is called,.
22ab0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ** the error sta
22ac0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
22ad0 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73   returned. It is
22ae0 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65   permitted to re
22af0 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ad the.** databa
22b00 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54  se when in SQLIT
22b10 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61  E_FULL error sta
22b20 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  te..**.** Otherw
22b30 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69  ise, if everythi
22b40 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
22b50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22b60 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a  eturned. If an.*
22b70 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  * IO error occur
22b80 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
22b90 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
22ba0 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
22bb0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
22bc0 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
22bd0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
22be0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
22bf0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
22c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
22c10 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
22c20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
22c30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22c40 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
22c50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22c60 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72  e */.  int isErr
22c70 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20  orReset = 0;    
22c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22c90 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20  e if recovering 
22ca0 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65  from error state
22cb0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
22cc0 73 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  s database has n
22cd0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
22ce0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
22cf0 64 20 69 73 20 69 6e 20 61 6e 20 0a 20 20 2a 2a  d is in an .  **
22d00 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68   error-state, th
22d10 69 73 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  is is a chance t
22d20 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
22d30 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 0a  r. Discard the .
22d40 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66    ** contents of
22d50 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
22d60 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 20 61 6e   and rollback an
22d70 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e  y hot journal in
22d80 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 2d 73   the.  ** file-s
22d90 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  ystem..  */.  if
22da0 28 20 21 4d 45 4d 44 42 20 26 26 20 73 71 6c 69  ( !MEMDB && sqli
22db0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
22dc0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22dd0 65 29 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  e)==0 && pPager-
22de0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
22df0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
22e00 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
22e10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  r->zJournal ){. 
22e20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65       isErrorRese
22e30 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
22e40 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22e50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22e60 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
22e70 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
22e80 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22e90 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72   still in an err
22ea0 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
22eb0 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72   proceed. The er
22ec0 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20  ror .  ** state 
22ed0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
22ee0 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
22ef0 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e   the future when
22f00 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20   all page .  ** 
22f10 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64  references are d
22f20 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63  ropped and the c
22f30 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
22f40 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  arded..  */.  if
22f50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
22f60 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
22f70 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
22f80 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
22f90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
22fa0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
22fb0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
22fc0 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72  _UNLOCK || isErr
22fd0 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73  orReset ){.    s
22fe0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
22ff0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
23000 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
23010 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  isHotJournal = 0
23020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
23030 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
23040 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
23050 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
23060 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
23070 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
23080 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
23090 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
230a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
230b0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
230c0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
230d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
230e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
230f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23100 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
23110 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
23120 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
23130 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
23140 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
23150 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23160 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
23170 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
23180 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
23190 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
231a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
231b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
231c0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
231d0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
231e0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
231f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
23200 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
23210 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
23220 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
23230 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
23240 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
23250 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
23260 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
23270 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
23280 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
23290 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a  &isHotJournal);.
232a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
232b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
232c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
232d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
232e0 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
232f0 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
23300 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  al ){.      /* G
23310 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
23320 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
23330 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
23340 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
23350 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
23360 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
23370 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
23380 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
23390 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
233a0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
233b0 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
233c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
233d0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
233e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
233f0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
23400 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
23410 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
23420 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
23430 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
23440 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
23450 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
23460 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
23470 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
23480 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
23490 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
234a0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
234b0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
234c0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
234d0 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
234e0 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
234f0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
23500 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
23510 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
23520 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
23530 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
23540 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
23550 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
23560 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
23570 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
23580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
23590 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
235a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
235b0 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  <EXCLUSIVE_LOCK 
235c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
235d0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
235e0 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
235f0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
23600 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23620 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
23630 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
23640 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
23650 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
23660 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
23670 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
23680 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
23690 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65  }. .      /* Ope
236a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
236b0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
236c0 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ess. This is bec
236d0 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  ause in .      *
236e0 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
236f0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
23700 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
23710 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
23720 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69  d.      ** possi
23730 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
23740 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
23750 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
23760 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
23770 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
23780 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
23790 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
237a0 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
237b0 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64  .      ** a read
237c0 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64  /write file hand
237d0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
237e0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
237f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
23800 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
23810 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23820 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
23830 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s,pPager->zJourn
23840 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53  al,SQLITE_ACCESS
23850 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20  _EXISTS,&res);. 
23860 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23880 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
23890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
238a0 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
238b0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
238c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
238d0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
238e0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
238f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23900 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
23910 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
23920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23930 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
23940 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
23950 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
23960 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
23970 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
23980 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
23990 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
239a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
239b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
239c0 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
239d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
239e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
239f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
23a00 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  PEN;.           
23a10 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
23a20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
23a30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
23a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
23a70 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
23a80 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
23a90 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 20  at some .       
23aa0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
23ab0 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
23ac0 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
23ad0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
23ae0 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  re .            
23af0 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
23b00 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
23b10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
23b20 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
23b30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79            ** may
23b40 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
23b50 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
23b60 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
23b70 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
23b80 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
23b90 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
23ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
23bb0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a  es not exist.  *
23bc0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
23bd0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
23be0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
23bf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
23c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23c10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
23c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23c30 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
23c40 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
23c50 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20 61    /* TODO: Why a
23c60 72 65 20 74 68 65 73 65 20 63 6c 65 61 72 65 64  re these cleared
23c70 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65 63   here? Is it nec
23c80 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20 20  essary? */.     
23c90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23ca0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
23cb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
23cc0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
23cd0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
23ce0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
23cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
23d00 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a   = 0;. .      /*
23d10 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
23d20 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
23d30 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
23d40 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
23d50 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
23d60 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
23d70 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
23d80 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
23d90 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
23da0 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
23db0 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
23dc0 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
23dd0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
23de0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 0a  nsistent cache..
23df0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
23e00 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23e10 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
23e20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
23e30 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
23e40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23e60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
23e70 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
23e80 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
23e90 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
23ec0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23ed0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
23ee0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
23ef0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
23f00 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
23f10 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
23f20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
23f30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23f40 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
23f50 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
23f60 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
23f70 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
23f80 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
23f90 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
23fa0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
23fb0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
23fc0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
23fd0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
23fe0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
23ff0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
24000 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
24010 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
24020 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
24030 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
24040 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
24050 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
24060 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
24070 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
24080 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
24090 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
240a0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
240b0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
240c0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
240d0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
240e0 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
240f0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
24100 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
24110 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
24120 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
24130 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
24140 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
24150 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
24160 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
24170 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
24180 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
24190 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
241a0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
241b0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
241c0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
241d0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
241e0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
241f0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
24200 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
24210 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
24220 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
24230 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
24240 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
24250 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
24260 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
24270 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
24280 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
24290 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
242a0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
242b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
242c0 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )];.      sqlite
242d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
242e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20  pPager, 0);..   
242f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
24300 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
24310 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
24320 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
24330 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
24340 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
24350 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
24360 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
24370 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
24380 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
24390 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
243a0 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
243b0 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
243c0 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
243d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
243e0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
243f0 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
24400 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
24410 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
24420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
24440 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
24450 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
24460 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
24470 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
24480 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
24490 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
244a0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
244b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
244c0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
244d0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
244e0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
244f0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
24500 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
24510 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24520 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
24530 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
24540 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
24550 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61  ARED );.  }.. fa
24560 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
24570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24580 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
24590 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
245a0 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
245b0 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
245c0 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
245d0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
245e0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
245f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24600 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
24610 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
24620 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
24630 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
24640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
24650 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
24660 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
24670 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
24680 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
24690 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
246a0 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
246b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
246c0 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
246d0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
246e0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
246f0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
24700 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
24710 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
24720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
24730 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
24740 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24750 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50  .  if( (sqlite3P
24760 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
24770 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
24780 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67 65  0).   && (!pPage
24790 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
247a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
247b0 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a  nalOff>0) .  ){.
247c0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
247d0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
247e0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
247f0 20 44 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f   Drop a page fro
24800 6d 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  m the cache usin
24810 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  g sqlite3PcacheD
24820 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rop()..**.** If 
24830 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65  this means there
24840 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65   are now no page
24850 73 20 77 69 74 68 20 72 65 66 65 72 65 6e 63 65  s with reference
24860 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c  s to them, a rol
24870 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20  lback.** occurs 
24880 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
24890 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
248a0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  removed..*/.stat
248b0 69 63 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f  ic void pagerDro
248c0 70 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 50  pPage(DbPage *pP
248d0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
248e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
248f0 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  r;.  sqlite3Pcac
24900 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70  heDrop(pPg);.  p
24910 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
24920 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ed(pPager);.}../
24930 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
24940 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
24950 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
24960 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
24970 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
24980 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
24990 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
249a0 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
249b0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
249c0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
249d0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
249e0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
249f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
24a00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24a10 6e 20 63 61 6c 6c 73 20 70 61 67 65 72 53 68 61  n calls pagerSha
24a20 72 65 64 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74  redLock() to obt
24a30 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
24a40 6b 20 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  k on.** the data
24a50 62 61 73 65 20 66 69 6c 65 20 69 66 20 73 75 63  base file if suc
24a60 68 20 61 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  h a lock or grea
24a70 74 65 72 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ter is not alrea
24a80 64 79 20 68 65 6c 64 2e 0a 2a 2a 20 54 68 69 73  dy held..** This
24a90 20 6d 61 79 20 63 61 75 73 65 20 68 6f 74 2d 6a   may cause hot-j
24aa0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
24ab0 6f 72 20 61 20 63 61 63 68 65 20 70 75 72 67 65  or a cache purge
24ac0 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a  . See comments.*
24ad0 2a 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  * above function
24ae0 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
24af0 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
24b00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
24b10 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
24b20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
24b30 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
24b40 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
24b50 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
24b60 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
24b70 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
24b80 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
24b90 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
24ba0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
24bb0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
24bc0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
24bd0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
24be0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
24bf0 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
24c00 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
24c10 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
24c20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
24c30 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
24c40 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
24c50 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
24c60 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
24c70 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
24c80 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
24c90 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
24ca0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
24cb0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
24cc0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
24cd0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
24ce0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
24cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24d00 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
24d10 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
24d20 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
24d30 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
24d40 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
24d50 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
24d60 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
24d70 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
24d80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
24d90 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
24da0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
24db0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
24dc0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
24dd0 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
24de0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
24df0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
24e00 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
24e10 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
24e20 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
24e30 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
24e40 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
24e50 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
24e60 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
24e70 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
24e80 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
24e90 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
24ea0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
24eb0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
24ec0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
24ed0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
24ee0 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
24ef0 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
24f00 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
24f10 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
24f20 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
24f30 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
24f40 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
24f50 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
24f60 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
24f70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
24f80 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
24f90 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
24fa0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
24fb0 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 77  he to populate w
24fc0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
24fd0 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
24fe0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
24ff0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
25000 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
25010 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
25020 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
25030 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
25040 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
25050 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
25060 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
25070 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
25080 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
25090 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
250a0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
250b0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
250c0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
250d0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
250e0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
250f0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
25100 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
25110 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
25120 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
25130 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
25140 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
25150 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
25160 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
25170 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
25180 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
25190 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
251a0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
251b0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
251c0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
251d0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
251e0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
251f0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
25200 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
25210 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
25220 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
25230 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
25240 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
25250 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
25260 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
25270 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
25280 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
25290 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
252a0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
252b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
252c0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
252d0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
252e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
252f0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
25300 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
25310 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
25320 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
25330 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
25340 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
25350 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
25360 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
25370 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
25380 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
25390 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
253a0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
253b0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
253c0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
253d0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
253e0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
253f0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
25400 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
25410 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
25420 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
25430 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
25440 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
25450 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
25460 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
25470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25480 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
25490 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
254a0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
254b0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
254c0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
254d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
254e0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
254f0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
25500 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
25510 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
25520 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
25530 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
25540 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
25550 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
25560 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
25570 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
25580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25590 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
255a0 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20  R_UNLOCK .      
255b0 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
255c0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
255d0 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20  ->pPCache)>0 .  
255e0 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a       || pgno==1.
255f0 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    );..  /* The m
25600 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
25610 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
25620 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25630 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
25640 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
25650 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
25660 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
25670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
25680 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
25690 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
256a0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
256b0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
256c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
256d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
256e0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
256f0 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
25700 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
25710 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
25720 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
25730 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
25740 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
25750 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
25760 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
25770 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
25780 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
25790 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
257a0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
257b0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
257c0 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
257d0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
257e0 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
257f0 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
25800 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
25810 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25820 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25830 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25840 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
25850 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
25860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
25870 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
25880 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
25890 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  1, &pPg);.  if( 
258a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
258b0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
258c0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
258d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
258e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
258f0 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
25900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
25910 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
25920 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
25930 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  0 );.  if( pPg->
25940 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pPager==0 ){.   
25950 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
25960 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
25970 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
25980 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
25990 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
259a0 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a  ialized..    */.
259b0 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
259c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
259d0 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
259e0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
259f0 50 61 67 65 72 3b 0a 0a 20 20 20 20 72 63 20 3d  Pager;..    rc =
25a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25a10 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
25a20 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
25a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25a50 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
25a60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25a70 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
25a80 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
25a90 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
25aa0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
25ab0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
25ac0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
25ad0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25ae0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
25af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
25b00 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
25b10 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
25b20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
25b30 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
25b40 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
25b50 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
25b60 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
25b70 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
25b80 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
25b90 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
25ba0 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
25bb0 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
25bc0 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
25bd0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25be0 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
25bf0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
25c00 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
25c10 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
25c20 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
25c30 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
25c40 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
25c50 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
25c60 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
25c70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25c80 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
25c90 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
25ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
25cb0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
25cc0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
25cd0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
25ce0 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
25cf0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
25d00 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
25d10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25d20 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
25d30 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
25d40 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
25d50 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
25d60 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
25d70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
25d80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25d90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
25da0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
25db0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
25dc0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 65  lloc();.      }e
25dd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
25de0 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
25df0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
25e00 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
25e10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
25e20 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
25e30 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
25e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25e50 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
25e60 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
25e70 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
25e80 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
25e90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
25eb0 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
25ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25ed0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
25ee0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
25ef0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
25f00 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
25f10 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
25f20 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
25f30 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
25f40 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
25f50 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
25f60 68 65 2e 20 2a 2f 0a 20 20 20 20 50 41 47 45 52  he. */.    PAGER
25f70 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
25f80 69 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 50  it);.  }..  *ppP
25f90 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
25fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25fb0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
25fc0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
25fd0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
25fe0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
25ff0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
26000 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
26010 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
26020 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
26030 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
26040 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
26050 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65   cache. Also, re
26060 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a  turn 0 if the .*
26070 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  * pager is in PA
26080 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
26090 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
260a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
260b0 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  * or if the page
260c0 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
260d0 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
260e0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
260f0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
26100 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
26110 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
26120 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
26130 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
26140 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
26150 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
26160 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
26170 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
26180 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
26190 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
261a0 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
261b0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
261c0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
261d0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
261e0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
261f0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
26200 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
26210 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
26220 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
26230 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
26240 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
26250 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
26260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26270 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
26280 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
26290 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
262a0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
262b0 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  K).   && (pPager
262c0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
262d0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
262e0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
262f0 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73  FULL).  ){.    s
26300 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
26310 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
26320 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
26330 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
26340 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
26350 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
26360 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
26370 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
26380 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
26390 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
263a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
263b0 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
263c0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
263d0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
263e0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
263f0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
26400 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
26410 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
26420 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26430 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
26440 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26450 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
26460 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
26470 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
26480 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
26490 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
264a0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
264b0 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
264c0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
264d0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
264e0 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
264f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
26500 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
26510 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61  ened, ensure tha
26520 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75  t the.** sub-jou
26530 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
26540 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61  n too. If the ma
26550 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  in journal is no
26560 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20  t open,.** this 
26570 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26580 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
26590 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
265a0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
265b0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
265c0 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51   plan. .** An SQ
265d0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
265e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
265f0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
26600 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  to .** sqlite3Os
26610 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  Open() fails..*/
26620 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
26630 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
26640 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26660 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
26670 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
26680 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
26690 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
266a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
266b0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
266c0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
266d0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
266e0 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
266f0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
26700 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
26710 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26720 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
26730 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
26740 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
26750 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
26760 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
26770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26780 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26790 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
267a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
267b0 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
267c0 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
267d0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
267e0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
267f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
26800 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
26810 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
26820 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
26830 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
26840 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
26850 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
26860 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
26870 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
26880 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
26890 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
268a0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
268b0 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
268c0 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
268d0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
268e0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
268f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
26900 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
26910 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
26920 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
26930 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
26940 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
26950 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
26960 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
26970 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
26980 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
26990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
269a0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
269b0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
269c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
269d0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
269e0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
269f0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
26a00 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
26a10 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
26a20 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
26a30 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
26a40 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
26a50 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
26a60 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
26a70 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
26a80 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
26a90 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
26aa0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
26ab0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
26ac0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
26ad0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
26ae0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
26af0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
26b00 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
26b10 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
26b20 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
26b30 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
26b40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
26b50 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
26b60 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
26b70 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
26b80 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
26b90 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
26ba0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26be0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
26bf0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
26c00 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
26c10 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
26c20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
26c30 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
26c40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26c50 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
26c60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26c70 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
26c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26c90 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26ca0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
26cb0 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
26cc0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
26cd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26ce0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
26cf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26d00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
26d10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
26d20 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20    }..  /* TODO: 
26d30 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73  Is it really pos
26d40 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72  sible to get her
26d50 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c  e with dbSizeVal
26d60 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20  id==0? If not,. 
26d70 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   ** the call to 
26d80 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
26d90 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e   can be removed.
26da0 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
26db0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
26dc0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71  Valid==0 );.  sq
26dd0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26de0 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
26df0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
26e00 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
26e10 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
26e20 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
26e30 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
26e40 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
26e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26e60 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
26e70 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
26e80 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
26e90 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
26ea0 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
26eb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
26ec0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
26ed0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
26ee0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26ef0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26f00 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
26f10 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
26f20 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
26f30 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
26f40 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
26f50 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
26f60 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
26f70 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
26f80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
26f90 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
26fa0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
26fb0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
26fc0 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
26fd0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
26fe0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
26ff0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
27000 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
27010 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
27020 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
27030 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66  ).        );.#if
27040 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27050 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
27060 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27070 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
27080 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
27090 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
270a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
270b0 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
270c0 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
270d0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
270e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
270f0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
27100 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
27110 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
27120 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
27130 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
27140 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
27150 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27160 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57   );.  }...  /* W
27170 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
27180 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
27190 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
271a0 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a  e and open .  **
271b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
271c0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
271d0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
271e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
271f0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
27200 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
27210 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
27220 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  d. */.    pPager
27230 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
27240 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
27250 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27260 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
27270 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
27280 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
27290 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
272a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
272b0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
272c0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
272d0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
272e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
272f0 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
27300 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
27310 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
27320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
27330 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
27340 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  t ){.    rc = op
27350 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
27360 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
27370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27380 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
27390 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
273a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
273b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
273c0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ournal = 0;.  }.
273d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
273e0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
273f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
27400 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
27410 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
27420 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
27430 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
27440 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
27450 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
27460 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
27470 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
27480 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
27490 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
274a0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
274b0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
274c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
274d0 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
274e0 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
274f0 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
27500 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
27510 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
27520 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
27530 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
27540 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
27550 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
27560 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
27570 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
27580 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e  n-memory file an
27590 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d, the journal f
275a0 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65  ile is .** opene
275b0 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  d if it has not 
275c0 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f  been already. Fo
275d0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  r a temporary fi
275e0 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  le, the opening 
275f0 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  .** of the journ
27600 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
27610 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
27620 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65  is an actual nee
27630 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74  d to .** write t
27640 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  o the journal. T
27650 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20  ODO: Why handle 
27660 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
27670 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a  differently?.**.
27680 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
27690 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
276a0 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c   (or if it is al
276b0 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65  ready open), the
276c0 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68  n a.** journal-h
276d0 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
276e0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
276f0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   it..**.** If th
27700 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
27710 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
27720 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
27730 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
27740 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
27750 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
27760 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
27770 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
27780 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
27790 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
277a0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
277b0 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
277c0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
277d0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
277e0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
277f0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
27800 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
27810 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
27820 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
27830 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
27840 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
27850 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
27860 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
27870 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
27880 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
27890 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
278a0 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
278b0 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
278c0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
278d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
278e0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
278f0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
27900 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
27910 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
27920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27940 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
27950 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65  NLOCK );.  pPage
27960 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
27970 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
27980 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ry;.  if( pPager
27990 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
279a0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
279b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
279c0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
279d0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
279e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
279f0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  pFile );..    /*
27a00 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
27a10 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
27a20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
27a30 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
27a40 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  meter.    ** is 
27a50 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
27a60 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
27a70 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
27a80 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
27a90 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
27aa0 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
27ab0 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
27ac0 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
27ad0 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f  LUSIVE.    ** lo
27ae0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
27af0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
27b00 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
27b10 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
27b20 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
27b30 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
27b40 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
27b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27b60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
27b70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
27b80 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28  ERVED;.      if(
27b90 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
27ba0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
27bb0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
27bc0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
27bd0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
27be0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
27bf0 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73 20   required locks 
27c00 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c 6c  were successfull
27c10 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65 6e  y obtained, open
27c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
27c30 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72 69   ** file and wri
27c40 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
27c50 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 69  rnal-header to i
27c60 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
27c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27c80 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
27c90 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20 70 50  urnal.     && pP
27ca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27cb0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27cc0 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b  MODE_OFF .    ){
27cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
27ce0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
27cf0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
27d00 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
27d10 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
27d20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27d30 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
27d40 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
27d50 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
27d60 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
27d70 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61  cess mode the la
27d80 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
27d90 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
27da0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
27db0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
27dc0 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
27dd0 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
27de0 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
27df0 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
27e00 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
27e10 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
27e20 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20   and either was 
27e30 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
27e40 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64  ytes or its head
27e50 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76  er was.    ** ov
27e60 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a  erwritten with z
27e70 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
27e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27e90 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
27ea0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27eb0 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
27ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27ed0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
27ee0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
27ef0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
27f00 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
27f10 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
27f20 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
27f30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27f40 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  )));.  assert( !
27f50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27f60 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
27f70 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
27f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
27f90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27fa0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
27fb0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
27fc0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
27fd0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
27fe0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
27ff0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
28000 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
28010 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
28020 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
28030 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
28040 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
28050 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
28060 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
28070 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
28080 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
28090 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
280a0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
280b0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
280c0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
280d0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
280e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
280f0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
28100 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
28110 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
28120 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
28130 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
28140 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28150 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
28160 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
28170 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
28180 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
28190 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
281a0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
281b0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
281c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
281d0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
281e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
281f0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
28200 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
28210 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
28220 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
28230 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
28240 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
28250 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
28260 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
28270 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
28280 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
28290 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
282a0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
282b0 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
282c0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
282d0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
282e0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  e(pPg) ){.    pP
282f0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
28300 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
28310 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
28320 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
28330 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
28340 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
28350 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
28360 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28370 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
28380 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
28390 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
283a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
283b0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
283c0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
283d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
283e0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
283f0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
28400 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
28410 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
28420 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
28430 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
28440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28450 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c  gerBegin(pPager,
28460 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   0, pPager->subj
28470 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69  InMemory);.    i
28480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28490 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
284a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
284b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
284c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
284d0 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
284e0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
284f0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
28500 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
28510 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
28520 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
28530 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
28540 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
28550 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
28560 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
28570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28580 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
285a0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
285b0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
285c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
285d0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
285e0 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
285f0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
28600 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
28610 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
28620 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
28630 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
28640 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
28650 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28660 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
28670 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
28680 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
28690 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
286a0 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65  al(pPg) && isOpe
286b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
286c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  {.      if( pPg-
286d0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
286e0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
286f0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
28700 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
28710 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
28720 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
28730 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
28740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
28750 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
28760 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
28770 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
28780 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
28790 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
287a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
287b0 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
287c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
287d0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
287e0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
287f0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
28800 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
28810 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
28820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28830 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
28840 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
28850 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
28860 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
28870 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
28880 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
28890 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
288a0 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
288b0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
288c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
288d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
288e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
288f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
28900 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
28910 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28940 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
28950 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28960 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
28970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
28980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28990 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
289a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
289b0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
289c0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
289d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
289e0 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
289f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28a00 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
28a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
28a30 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
28a40 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
28a50 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
28a60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28a70 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
28a80 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
28a90 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
28aa0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
28ab0 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
28ac0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28ad0 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
28ae0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
28af0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
28b00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28b10 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
28b20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
28b30 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
28b40 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28b50 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
28b60 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
28b70 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  )));..        /*
28b80 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
28b90 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
28ba0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
28bb0 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
28bc0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
28bd0 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
28be0 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
28bf0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
28c00 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
28c10 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
28c20 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
28c30 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
28c40 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
28c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
28c60 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
28c70 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
28c80 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
28c90 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
28ca0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
28cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
28cc0 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
28cd0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
28ce0 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
28cf0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
28d00 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
28d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28d20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
28d30 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28d40 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28d50 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28d60 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28d70 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28d80 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  1;.        }..  
28d90 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
28da0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77  r has occurred w
28db0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
28dc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
28dd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
28de0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
28df0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
28e00 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
28e10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28e20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28e50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28e60 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
28e70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28e80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
28e90 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
28ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
28eb0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
28ec0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
28ed0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
28ee0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
28ef0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28f00 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
28f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
28f20 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
28f30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
28f40 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
28f50 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
28f60 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28f90 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28fa0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28fb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28fe0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
28ff0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
29000 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
29010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
29020 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
29030 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
29040 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
29050 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
29070 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
29080 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
29090 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
290b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
290c0 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
290d0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
290e0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
290f0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
29100 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
29110 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
29120 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
29130 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
29140 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
29150 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
29160 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
29170 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
29180 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
29190 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
291a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
291b0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
291c0 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
291d0 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
291e0 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
291f0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
29200 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
29210 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
29220 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
29230 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29240 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
29250 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
29260 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29270 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
29280 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
29290 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
292a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
292b0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
292c0 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
292d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
292e0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
292f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
29300 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
29310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29320 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
29330 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
29340 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
29350 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
29360 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
29370 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
29380 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
29390 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
293a0 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
293b0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
293c0 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
293d0 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
293e0 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
293f0 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
29400 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
29410 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
29420 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
29430 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29440 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
29450 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
29460 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
29470 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
29480 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
29490 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
294a0 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
294b0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
294c0 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
294d0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
294e0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
294f0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
29500 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
29510 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
29520 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
29530 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
29540 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
29550 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29560 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
29570 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
29580 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
29590 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
295a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
295b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
295c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
295d0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
295e0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
295f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
29600 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
29610 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
29620 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
29630 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
29640 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
29650 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
29660 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
29670 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
29680 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
29690 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
296a0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
296b0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
296c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
296d0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
296e0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
296f0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
29700 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
29710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29720 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
29730 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
29740 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
29750 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29780 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
29790 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
297a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
297b0 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
297c0 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
297d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
297e0 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
297f0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
29800 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
29810 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
29820 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
29830 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
29840 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
29850 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
29860 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
29870 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29880 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29890 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
298a0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
298b0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
298c0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
298d0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
298e0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
298f0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
29900 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
29910 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
29920 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
29930 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
29940 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
29950 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
29960 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29970 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29980 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
29990 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
299a0 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
299b0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
299c0 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   1;..    sqlite3
299d0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
299e0 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
299f0 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
29a00 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
29a10 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
29a20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
29a30 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
29a40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
29a50 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
29a60 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
29a70 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29a80 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
29a90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29aa0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
29ab0 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
29ac0 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
29ad0 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
29ae0 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
29af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
29b00 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
29b10 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
29b20 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
29b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
29b40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
29b50 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
29b60 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
29b70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
29b80 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
29b90 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
29ba0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29bb0 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
29bc0 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
29bd0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
29be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29bf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
29c00 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
29c10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29c20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29c40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
29c50 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
29c60 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29c70 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
29c80 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
29c90 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
29ca0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
29cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
29cc0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29ce0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29cf0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
29d00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
29d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
29d30 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
29d40 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
29d50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29d60 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
29d70 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
29d80 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29d90 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
29da0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29db0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29dd0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
29de0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29df0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
29e00 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
29e10 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
29e20 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
29e30 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
29e40 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
29e50 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
29e60 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
29e70 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
29e80 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
29e90 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
29ea0 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
29eb0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
29ec0 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
29ed0 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
29ee0 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
29ef0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
29f00 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
29f10 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29f20 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
29f30 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
29f40 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
29f50 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
29f60 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
29f70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
29f80 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
29f90 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
29fa0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
29fb0 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
29fc0 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
29fd0 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
29fe0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
29ff0 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
2a000 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
2a010 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
2a020 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2a030 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2a040 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a050 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
2a060 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
2a070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a080 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
2a090 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
2a0a0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
2a0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2a0c0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
2a0d0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
2a0e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a0f0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2a100 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
2a110 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
2a120 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
2a130 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
2a140 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
2a150 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2a160 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
2a170 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
2a180 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
2a190 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
2a1a0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2a1b0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
2a1c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
2a1d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2a1e0 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
2a1f0 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
2a200 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
2a210 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
2a220 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
2a230 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
2a240 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
2a250 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
2a260 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
2a270 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
2a280 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
2a290 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
2a2a0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
2a2b0 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
2a2c0 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
2a2d0 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
2a2e0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2a2f0 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
2a300 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2a310 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
2a320 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
2a330 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
2a340 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
2a350 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
2a360 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2a370 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
2a380 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
2a390 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
2a3a0 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
2a3b0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
2a3c0 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
2a3d0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
2a3e0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2a3f0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
2a400 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
2a410 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
2a420 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
2a430 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
2a440 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2a450 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a460 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a470 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2a480 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2a490 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2a4a0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2a4b0 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
2a4c0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2a4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
2a4e0 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
2a4f0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
2a500 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
2a510 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2a520 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
2a530 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
2a540 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2a550 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
2a560 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
2a570 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
2a580 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
2a590 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
2a5a0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
2a5b0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
2a5c0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
2a5d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a5e0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
2a5f0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
2a600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a610 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
2a620 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
2a630 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
2a640 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
2a650 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
2a660 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
2a670 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
2a680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
2a690 72 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72  rect flag is zer
2a6a0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2a6b0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2a6c0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2a6d0 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2a6e0 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2a6f0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a700 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2a710 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2a720 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2a730 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2a740 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2a750 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2a760 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2a770 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20  e isDirect flag 
2a780 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d  may only be non-
2a790 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72  zero if the libr
2a7a0 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
2a7b0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c  .** with the SQL
2a7c0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2a7d0 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65  C_WRITE macro de
2a7e0 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  fined. In this c
2a7f0 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72  ase,.** if isDir
2a800 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ect is non-zero,
2a810 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2a820 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74  se file is updat
2a830 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
2a840 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64  y writing an upd
2a850 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
2a860 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63  page 1 using a c
2a870 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73  all to the .** s
2a880 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
2a890 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2a8a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
2a8b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2a8c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2a8d0 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65  int isDirectMode
2a8e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a8f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44  LITE_OK;..  /* D
2a900 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69  eclare and initi
2a910 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69  alize constant i
2a920 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74  nteger 'isDirect
2a930 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61  '. If the.  ** a
2a940 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2a950 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62  mization is enab
2a960 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2a970 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74  d, then isDirect
2a980 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  .  ** is initial
2a990 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75  ized to the valu
2a9a0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2a9b0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72  isDirectMode par
2a9c0 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74  ameter.  ** to t
2a9d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74  his function. Ot
2a9e0 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61  herwise, it is a
2a9f0 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
2aa00 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
2aa10 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66   idea is that if
2aa20 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2aa30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2aa40 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c  s not.  ** enabl
2aa50 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2aa60 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  me, the compiler
2aa70 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65   can omit the te
2aa80 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44  sts of.  ** 'isD
2aa90 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73  irect' below, as
2aaa0 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f   well as the blo
2aab0 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74  ck enclosed in t
2aac0 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44  he.  ** "if( isD
2aad0 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69  irect )" conditi
2aae0 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  on..  */.#ifndef
2aaf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2ab00 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f  TOMIC_WRITE.  co
2ab10 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74  nst int isDirect
2ab20 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2ab30 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
2ab40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2ab50 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
2ab60 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  de);.#else.  con
2ab70 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20  st int isDirect 
2ab80 3d 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a  = isDirectMode;.
2ab90 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2aba0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2abb0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2abc0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2abd0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2abe0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
2abf0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
2ac00 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
2ac10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ac20 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2ac30 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61  1 */.    u32 cha
2ac40 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20  nge_counter;    
2ac50 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2ac60 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67  l value of chang
2ac70 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2ac80 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
2ac90 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2aca0 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
2acb0 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
2acc0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
2acd0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
2ace0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
2acf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ad00 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
2ad10 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
2ad20 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
2ad30 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2ad40 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
2ad50 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
2ad60 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
2ad70 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
2ad80 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
2ad90 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
2ada0 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
2adb0 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
2adc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2add0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ade0 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
2adf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ae00 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2ae10 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2ae20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ae30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2ae40 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2ae50 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2ae60 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2ae70 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2ae80 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2ae90 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2aea0 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2aeb0 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2aec0 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2aed0 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2aee0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2aef0 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2af00 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2af10 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
2af20 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
2af30 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
2af40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
2af50 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
2af60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
2af70 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  irect ){.       
2af80 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
2af90 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74  f = pPgHdr->pDat
2afa0 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  a;.        asser
2afb0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  t( pPager->dbFil
2afc0 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20  eSize>0 );.     
2afd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2afe0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2aff0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
2b000 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
2b010 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2b020 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   If everything w
2b030 6f 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63  orked, set the c
2b040 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
2b050 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  lag. */.      if
2b060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b070 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2b080 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2b090 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
2b0a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
2b0b0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
2b0c0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
2b0d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2b0e0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
2b0f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b100 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70  /*.** Sync the p
2b110 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73  ager file to dis
2b120 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  k. This is a no-
2b130 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  op for in-memory
2b140 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67   files.** or pag
2b150 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65  es with the Page
2b160 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65  r.noSync flag se
2b170 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
2b180 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65  essful, or calle
2b190 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72  d on a pager for
2b1a0 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e   which it is a n
2b1b0 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75  o-op, this.** fu
2b1c0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2b1d0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
2b1e0 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  ise, an IO error
2b1f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2b200 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2b210 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
2b220 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2b230 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b250 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2b260 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
2b270 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
2b280 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
2b290 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2b2a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2b2b0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2b2c0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2b2d0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
2b2e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b2f0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
2b300 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
2b310 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
2b320 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
2b330 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
2b340 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
2b350 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
2b360 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
2b370 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
2b380 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
2b390 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
2b3a0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
2b3b0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2b3c0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
2b3d0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
2b3e0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
2b3f0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
2b400 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2b410 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
2b420 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2b430 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
2b440 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
2b450 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
2b460 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
2b470 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
2b480 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2b490 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
2b4a0 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
2b4b0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
2b4c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b4d0 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
2b4e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b4f0 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
2b500 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
2b510 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
2b520 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
2b530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
2b540 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
2b550 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
2b560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2b570 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
2b580 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
2b590 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
2b5a0 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
2b5b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
2b5c0 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
2b5d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b5e0 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
2b5f0 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
2b600 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
2b610 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
2b620 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
2b630 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
2b640 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
2b650 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2b660 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
2b670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2b680 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
2b690 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
2b6a0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
2b6b0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2b6c0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
2b6d0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
2b6e0 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
2b6f0 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
2b700 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
2b710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b720 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2b730 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
2b740 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
2b750 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
2b760 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2b770 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b780 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
2b790 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2b7c0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2b7d0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
2b7e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
2b7f0 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
2b800 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
2b810 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b830 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2b840 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
2b850 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
2b860 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2b870 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2b880 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2b890 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ode */..  if( pP
2b8a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
2b8b0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
2b8c0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2b8d0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2b8e0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
2b8f0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
2b900 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
2b910 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
2b920 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
2b930 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
2b940 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
2b950 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2b960 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
2b970 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
2b980 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
2b990 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
2b9a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2b9b0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
2b9c0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
2b9d0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
2b9e0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2b9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
2ba00 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
2ba10 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
2ba20 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
2ba30 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
2ba40 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64  CED && pPager->d
2ba50 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20  bModified ){..  
2ba60 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2ba70 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
2ba80 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2ba90 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
2baa0 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
2bab0 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20  this depends on 
2bac0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
2bad0 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
2bae0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
2baf0 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
2bb00 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2bb10 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
2bb20 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
2bb30 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74  the .    ** runt
2bb40 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
2bb50 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
2bb60 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n: .    **.    *
2bb70 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d  *    * The file-
2bb80 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
2bb90 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2bba0 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
2bbb0 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
2bbc0 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
2bbd0 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20  ze, and .    ** 
2bbe0 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74     * This commit
2bbf0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
2bc00 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
2bc10 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
2bc20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
2bc30 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
2bc40 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
2bc50 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
2bc60 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2bc70 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
2bc80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
2bc90 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
2bca0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2bcb0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  hen the.    ** p
2bcc0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2bcd0 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
2bce0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2bcf0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
2bd00 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72  e.    ** counter
2bd10 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f   in 'indirect-mo
2bd20 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69  de'. If the opti
2bd30 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  mization is comp
2bd40 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20  iled in but.    
2bd50 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63  ** is not applic
2bd60 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61  able to this tra
2bd70 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73  nsaction, call s
2bd80 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2bd90 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20  ate().    ** to 
2bda0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f  make sure the jo
2bdb0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61  urnal file has a
2bdc0 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65  ctually been cre
2bdd0 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a  ated, then call.
2bde0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
2bdf0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2be00 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
2be10 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2be20 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a  n indirect.    *
2be30 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a  * mode. .    **.
2be40 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
2be50 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
2be60 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
2be70 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
2be80 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  able,.    ** the
2be90 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
2bea0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2beb0 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
2bec0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
2bed0 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74     ** in 'direct
2bee0 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  ' mode. In this 
2bef0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2bf00 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
2bf10 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
2bf20 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
2bf30 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
2bf40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2bf50 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2bf60 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  E.    PgHdr *pPg
2bf70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2bf80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2bf90 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) || pPager->jou
2bfa0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2bfb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2bfc0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
2bfd0 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
2bfe0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
2bff0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2c000 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
2c010 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a  erSize(pPager) .
2c020 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2c030 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e  dbSize>=pPager->
2c040 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20  dbFileSize.     
2c050 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71  && (0==(pPg = sq
2c060 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2c070 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2c080 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67  ache)) || 0==pPg
2c090 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b  ->pDirty).    ){
2c0a0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2c0b0 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61   the db file cha
2c0c0 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20  nge counter via 
2c0d0 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65  the direct-write
2c0e0 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20   method. The .  
2c0f0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
2c100 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
2c110 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
2c120 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2c130 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
2c140 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
2c150 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
2c160 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
2c170 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
2c180 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
2c190 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
2c1a0 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
2c1b0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
2c1c0 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  ite .      ** pr
2c1d0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
2c1e0 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
2c1f0 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
2c200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2c210 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2c220 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2c230 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 1);.    }else
2c240 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2c250 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2c260 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2c270 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c290 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2c2a0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c2b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2c2c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65     }.    }.#else
2c2d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2c2e0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c2f0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23  er(pPager, 0);.#
2c300 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
2c310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c320 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2c330 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2c340 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
2c350 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
2c360 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
2c370 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
2c380 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67  ges.    ** being
2c390 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
2c3a0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
2c3b0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
2c3c0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
2c3d0 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61  ** file. This ca
2c3e0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e  n only happen in
2c3f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2c400 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2c410 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20   Before reading 
2c420 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70  the pages with p
2c430 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67  age numbers larg
2c440 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20  er than the .   
2c450 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
2c460 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
2c470 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
2c480 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
2c490 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74      ** that it t
2c4a0 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72 74  ook at the start
2c4b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
2c4c0 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2c4d0 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  the.    ** calls
2c4e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2c4f0 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
2c500 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
2c510 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61  d of .    ** rea
2c520 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74  ding data from t
2c530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c540 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2c550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c560 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2c570 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
2c580 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c590 65 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72  e.     && pPager
2c5a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2c5b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c5c0 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20  _OFF .    ){.   
2c5d0 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20     Pgno i;      
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c600 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2c610 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
2c620 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41   Pgno iSkip = PA
2c630 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2c640 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20  er); /* Pending 
2c650 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20  lock page */.   
2c660 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
2c670 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2c680 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
2c690 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
2c6a0 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50  ize */ .      pP
2c6b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
2c6c0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c6d0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d  e;.      for( i=
2c6e0 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61  dbSize+1; i<=pPa
2c6f0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2c700 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
2c710 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
2c720 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2c730 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
2c740 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
2c750 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
2c760 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2c770 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
2c780 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
2c790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c7a0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
2c7b0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
2c7c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c7d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2c7e0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2c7f0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  it;.          rc
2c800 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c810 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
2c820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2c830 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2c840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c860 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c870 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2c880 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
2c890 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2c8a0 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
2c8b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2c8c0 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
2c8d0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
2c8e0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2c8f0 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74   file. If a mast
2c900 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  er .    ** journ
2c910 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
2c920 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
2c930 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2c940 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
2c950 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72  ** or if zMaster
2c960 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73   is NULL (no mas
2c970 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68  ter journal), th
2c980 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
2c990 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
2c9a0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
2c9b0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
2c9c0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
2c9d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c9e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c9f0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2ca00 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
2ca10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2ca20 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75   If the atomic-u
2ca30 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2ca40 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  on is being.    
2ca50 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61  ** used, this ca
2ca60 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61  ll will not crea
2ca70 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2ca80 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
2ca90 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49  ny.    ** real I
2caa0 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  O..    */.    rc
2cab0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2cac0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
2cad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2cae0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2caf0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2cb00 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
2cb10 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
2cb20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2cb30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2cb40 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2cb50 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69  (sqlite3PcacheDi
2cb60 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2cb70 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69  pPCache));.    i
2cb80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cb90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2cba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
2cbb0 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
2cbc0 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
2cbd0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2cbe0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2cbf0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
2cc00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2cc10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2cc20 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
2cc30 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69   not the same si
2cc40 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ze as the databa
2cc50 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a  se image,.    **
2cc60 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f   then use pager_
2cc70 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77  truncate to grow
2cc80 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66   or shrink the f
2cc90 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ile here..    */
2cca0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2ccb0 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  >dbSize!=pPager-
2ccc0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
2ccd0 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d       Pgno nNew =
2cce0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2ccf0 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  - (pPager->dbSiz
2cd00 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  e==PAGER_MJ_PGNO
2cd10 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
2cd20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cd30 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2cd40 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20  CLUSIVE );.     
2cd50 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
2cd60 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65  cate(pPager, nNe
2cd70 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  w);.      if( rc
2cd80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2cd90 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2cda0 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  one_exit;.    }.
2cdb0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  .    /* Finally,
2cdc0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2cdd0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2cde0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
2cdf0 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
2ce00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2ce10 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2ce20 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
2ce30 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
2ce40 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
2ce50 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
2ce60 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
2ce70 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2ce80 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63  R_SYNCED;.  }..c
2ce90 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2cea0 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
2ceb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
2cec0 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
2ced0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2cee0 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
2cef0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
2cf00 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
2cf10 20 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c   ** lock to spil
2cf20 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
2cf30 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
2cf40 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
2cf50 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73  .    ** there is
2cf60 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
2cf70 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
2cf80 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20  tent, it is.    
2cf90 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74  ** better to ret
2cfa0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
2cfb0 0a 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20  .    **/.    rc 
2cfc0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2cfd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2cfe0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  }.../*.** When t
2cff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d000 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61  called, the data
2d010 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
2d020 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  en completely.**
2d030 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
2d040 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20  ect the changes 
2d050 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72  made by the curr
2d060 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2d070 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f  and.** synced to
2d080 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e   disk. The journ
2d090 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  al file still ex
2d0a0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2d0b0 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75  -system .** thou
2d0c0 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69  gh, and if a fai
2d0d0 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74  lure occurs at t
2d0e0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c  his point it wil
2d0f0 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  l eventually.** 
2d100 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74  be used as a hot
2d110 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65  -journal and the
2d120 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2d130 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  tion rolled back
2d140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d150 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20  ction finalizes 
2d160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d170 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65  , either by dele
2d180 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61  ting, .** trunca
2d190 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c  ting or partiall
2d1a0 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f  y zeroing it, so
2d1b0 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20   that it cannot 
2d1c0 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
2d1d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2d1e0 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20  back. Once this 
2d1f0 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e  is done the tran
2d200 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72  saction is.** ir
2d210 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74  revocably commit
2d220 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
2d230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2d240 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2d250 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2d260 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76  the pager.** mov
2d270 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  es into the erro
2d280 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  r state. Otherwi
2d290 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
2d2a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2d2b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2d2c0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
2d2d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d2e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d2f0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2d300 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d310 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  de */..  /* Do n
2d320 6f 74 20 70 72 6f 63 65 65 64 20 69 66 20 74 68  ot proceed if th
2d330 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
2d340 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
2d350 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
2d360 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
2d370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
2d380 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2d390 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2d3a0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
2d3b0 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  t be called if t
2d3c0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
2d3d0 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a  in at least.  **
2d3e0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2d3f0 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65  state. And indee
2d400 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64  d SQLite never d
2d410 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74  oes this. But it
2d420 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f   is.  ** nice to
2d430 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e   have this defen
2d440 73 69 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20  sive block here 
2d450 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69  anyway..  */.  i
2d460 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2d470 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
2d480 45 52 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65  ERVED) ){.    re
2d490 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2d4a0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20  R;.  }..  /* An 
2d4b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
2d4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2d4d0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
2d4e0 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
2d4f0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2d500 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
2d510 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2d520 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
2d530 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
2d540 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
2d550 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
2d560 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2d570 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
2d580 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2d590 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
2d5a0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
2d5b0 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
2d5c0 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
2d5d0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
2d5e0 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
2d5f0 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
2d600 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
2d610 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
2d620 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2d630 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
2d640 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
2d650 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
2d660 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
2d670 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2d680 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
2d690 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
2d6a0 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
2d6b0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
2d6c0 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
2d6d0 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
2d6e0 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
2d6f0 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
2d700 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2d710 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
2d720 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
2d730 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2d740 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2d750 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2d760 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
2d770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2d780 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
2d790 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
2d7a0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2d7b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2d7c0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
2d7d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
2d7e0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2d7f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d800 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
2d810 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
2d820 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2d830 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
2d840 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2d850 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2d860 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2d870 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2d880 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2d890 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
2d8a0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
2d8b0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
2d8c0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
2d8d0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
2d8e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2d8f0 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
2d900 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
2d910 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
2d920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d930 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
2d940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2d950 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
2d960 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
2d970 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
2d980 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
2d990 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2d9a0 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
2d9b0 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
2d9c0 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
2d9d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2d9e0 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
2d9f0 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
2da00 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
2da10 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
2da20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
2da30 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
2da40 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
2da50 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
2da60 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
2da70 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
2da80 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
2da90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2daa0 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
2dab0 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
2dac0 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
2dad0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
2dae0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
2daf0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
2db00 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
2db10 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2db20 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2db30 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
2db40 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
2db50 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
2db60 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
2db70 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
2db80 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
2db90 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
2dba0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
2dbb0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2dbc0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
2dbd0 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
2dbe0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
2dbf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
2dc00 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
2dc10 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2dc20 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2dc30 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2dc40 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
2dc50 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
2dc60 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
2dc70 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
2dc80 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
2dc90 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
2dca0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
2dcb0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2dcc0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2dcd0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
2dce0 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
2dcf0 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
2dd00 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2dd10 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2dd20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2dd30 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
2dd40 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
2dd50 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
2dd60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2dd70 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
2dd80 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
2dd90 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
2dda0 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
2ddb0 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
2ddc0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
2ddd0 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
2dde0 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
2ddf0 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
2de00 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
2de10 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
2de20 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
2de30 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
2de40 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
2de50 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
2de60 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
2de70 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
2de80 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2de90 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
2dea0 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
2deb0 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2dec0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
2ded0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
2dee0 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
2def0 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
2df00 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2df10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
2df20 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
2df30 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
2df40 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
2df50 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
2df60 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
2df70 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
2df80 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
2df90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2dfa0 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
2dfb0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
2dfc0 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
2dfd0 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
2dfe0 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
2dff0 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
2e000 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
2e010 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
2e020 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
2e030 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2e040 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
2e050 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e060 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e070 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2e080 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e090 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
2e0a0 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
2e0b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2e0c0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2e0d0 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2e0e0 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ied || !isOpen(p
2e0f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2e100 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
2e110 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2e120 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2e130 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73  tMaster);.  }els
2e140 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
2e150 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
2e160 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e170 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
2e180 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2e190 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2e1a0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
2e1b0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e1c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
2e1d0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2e1e0 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2e1f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2e200 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
2e210 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ED ){.      int 
2e220 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
2e230 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e240 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2e250 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
2e260 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2e270 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2e280 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
2e290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e2b0 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
2e2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e2d0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2e2e0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
2e2f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
2e300 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
2e310 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e320 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
2e330 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2e340 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
2e350 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
2e360 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
2e370 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
2e380 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
2e390 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
2e3a0 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
2e3b0 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
2e3c0 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74   .    ** persist
2e3d0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e3e0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
2e3f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2e400 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e410 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e420 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
2e430 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
2e440 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
2e450 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
2e460 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2e470 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
2e480 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71  itable..*/.u8 sq
2e490 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
2e4a0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
2e4b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e4c0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
2e4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e4e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2e4f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2e500 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
2e510 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
2e520 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2e530 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2e540 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2e550 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e560 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2e570 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2e580 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2e590 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2e5a0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
2e5b0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2e5c0 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
2e5d0 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2e5e0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
2e5f0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
2e600 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e610 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
2e620 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2e630 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
2e640 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2e650 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
2e660 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
2e670 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
2e680 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
2e690 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
2e6a0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2e6b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e6c0 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
2e6d0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
2e6e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e6f0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
2e700 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
2e710 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
2e720 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
2e730 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e740 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
2e750 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
2e760 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
2e770 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
2e780 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2e790 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
2e7a0 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
2e7b0 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
2e7c0 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
2e7d0 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
2e7e0 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
2e7f0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
2e800 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
2e810 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
2e820 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
2e830 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2e840 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
2e850 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
2e860 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e870 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
2e880 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e890 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
2e8a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2e8b0 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
2e8c0 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
2e8d0 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
2e8e0 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
2e8f0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
2e900 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
2e910 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
2e920 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
2e930 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
2e940 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
2e950 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
2e960 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2e970 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
2e980 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
2e990 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
2e9a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2e9b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2e9c0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e9d0 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
2e9e0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
2e9f0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2ea00 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2ea10 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
2ea20 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
2ea30 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
2ea40 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
2ea50 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2ea60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2ea70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2ea80 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
2ea90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
2eaa0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2eab0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2eac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ead0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2eae0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2eaf0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
2eb00 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
2eb10 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2eb20 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2eb30 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
2eb40 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
2eb50 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
2eb60 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2eb70 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2eba0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2ebb0 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
2ebc0 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ebe0 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
2ebf0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
2ec00 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2ec10 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
2ec20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73  journal or the s
2ec30 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
2ec40 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  en or .    ** th
2ec50 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  e journal is alw
2ec60 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  ays stored in me
2ec70 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  mory */.    asse
2ec80 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2ec90 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f  epoint==0 || isO
2eca0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2ecb0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2ecc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ecd0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2ece0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2ecf0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
2ed00 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
2ed10 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
2ed20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
2ed30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
2ed40 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
2ed50 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
2ed60 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
2ed70 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
2ed80 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
2ed90 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2eda0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
2edb0 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
2edc0 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
2edd0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
2ede0 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
2edf0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
2ee00 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
2ee10 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2ee20 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
2ee30 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
2ee40 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
2ee50 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
2ee60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2ee70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ee80 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
2ee90 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
2eea0 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
2eeb0 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
2eec0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
2eed0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
2eee0 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
2eef0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2ef00 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
2ef10 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
2ef20 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
2ef30 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
2ef40 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
2ef50 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
2ef60 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
2ef70 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2ef80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ef90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2efa0 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
2efb0 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
2efc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2efd0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2efe0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2eff0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2f000 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
2f010 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
2f020 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2f030 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
2f040 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
2f050 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
2f060 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2f070 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2f080 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
2f090 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
2f0a0 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
2f0b0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2f0c0 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
2f0d0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
2f0e0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
2f0f0 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
2f100 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
2f110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f120 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f130 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2f140 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2f150 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
2f160 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
2f170 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
2f180 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2f190 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2f1a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f1b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f1c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2f1d0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
2f1e0 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
2f1f0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65  avepoint..** The
2f200 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65   savepoint to re
2f210 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
2f220 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  k need not be th
2f230 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2f240 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65  .** created save
2f250 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  point..**.** Par
2f260 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77  ameter op is alw
2f270 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50  ays either SAVEP
2f280 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
2f290 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
2f2a0 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  SE..** If it is 
2f2b0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2f2c0 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  E, then release 
2f2d0 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20  and destroy the 
2f2e0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a  savepoint with.*
2f2f0 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69  * index iSavepoi
2f300 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  nt. If it is SAV
2f310 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
2f320 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61   then rollback a
2f330 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  ll changes.** th
2f340 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  at have occurred
2f350 20 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69   since the speci
2f360 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77  fied savepoint w
2f370 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  as created..**.*
2f380 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
2f390 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
2f3a0 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69  elease is identi
2f3b0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
2f3c0 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74  r .** iSavepoint
2f3d0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d  . A value of 0 m
2f3e0 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20  eans to operate 
2f3f0 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  on the outermost
2f400 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74   savepoint.** (t
2f410 68 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64  he first created
2f420 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50  ). A value of (P
2f430 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d  ager.nSavepoint-
2f440 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65  1) means operate
2f450 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  .** on the most 
2f460 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
2f470 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69   savepoint. If i
2f480 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
2f490 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61  ater than.** (Pa
2f4a0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2f4b0 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
2f4c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2f4d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67  ..**.** If a neg
2f4e0 61 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70  ative value is p
2f4f0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2f500 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  nction, then the
2f510 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2f520 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
2f530 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
2f540 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c  different to cal
2f550 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
2f560 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
2f570 62 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  because this fun
2f580 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74  ction does not t
2f590 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20  erminate.** the 
2f5a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75  transaction or u
2f5b0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
2f5c0 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74  se, it just rest
2f5d0 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  ores the .** con
2f5e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
2f5f0 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2f600 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a  ginal state. .**
2f610 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c  .** In any case,
2f620 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
2f630 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72  with an index gr
2f640 65 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65  eater than iSave
2f650 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65  point .** are de
2f660 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73  stroyed. If this
2f670 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70   is a release op
2f680 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56  eration (op==SAV
2f690 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c  EPOINT_RELEASE),
2f6a0 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69  .** then savepoi
2f6b0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  nt iSavepoint is
2f6c0 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e   also destroyed.
2f6d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2f6e0 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2f6f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2f700 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
2f710 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72  ion fails,.** or
2f720 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2f730 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  e if an IO error
2f740 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f   occurs while ro
2f750 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a  lling back a .**
2f760 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e   savepoint. If n
2f770 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20  o errors occur, 
2f780 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2f790 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73  urned..*/ .int s
2f7a0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
2f7b0 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
2f7c0 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  er, int op, int 
2f7d0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
2f7e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f7f0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70  K;..  assert( op
2f800 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
2f810 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
2f820 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
2f830 0a 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65  .  assert( iSave
2f840 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d  point>=0 || op==
2f850 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2f860 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61  CK );..  if( iSa
2f870 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e  vepoint<pPager->
2f880 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
2f890 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2f8a0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2f8b0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2f8c0 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
2f8d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f8e0 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70   remaining savep
2f8f0 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73  oints after this
2f900 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   op. */..    /* 
2f910 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2f920 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77  any savepoints w
2f930 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74  ill still be act
2f940 69 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20  ive after this. 
2f950 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e     ** operation.
2f960 20 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75   Store this valu
2f970 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20  e in nNew. Then 
2f980 66 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61  free resources a
2f990 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a  ssociated .    *
2f9a0 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70  * with any savep
2f9b0 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64  oints that are d
2f9c0 65 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73  estroyed by this
2f9d0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
2f9e0 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53  */.    nNew = iS
2f9f0 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d  avepoint + (op==
2fa00 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2fa10 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  CK);.    for(ii=
2fa20 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d  nNew; ii<pPager-
2fa30 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
2fa40 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2fa50 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2fa60 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2fa70 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
2fa80 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
2fa90 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2faa0 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f  t = nNew;..    /
2fab0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
2fac0 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
2fad0 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20  n, playback the 
2fae0 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
2faf0 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  int..    ** If t
2fb00 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69  his is a temp-fi
2fb10 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  le, it is possib
2fb20 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  le that the jour
2fb30 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20  nal file has.   
2fb40 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
2fb50 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
2fb60 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65   case there have
2fb70 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
2fb80 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
2fb90 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f  atabase file, so
2fba0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70   the playback op
2fbb0 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73  eration can be s
2fbc0 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
2fbd0 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
2fbe0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26  OINT_ROLLBACK &&
2fbf0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2fc00 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61  jfd) ){.      Pa
2fc10 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
2fc20 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77  avepoint = (nNew
2fc30 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e  ==0)?0:&pPager->
2fc40 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d  aSavepoint[nNew-
2fc50 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  1];.      rc = p
2fc60 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
2fc70 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53  point(pPager, pS
2fc80 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
2fc90 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49   assert(rc!=SQLI
2fca0 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a  TE_DONE);.    }.
2fcb0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
2fcc0 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f  s is a release o
2fcd0 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
2fce0 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63  savepoint, trunc
2fcf0 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
2fd00 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a  sub-journal to z
2fd10 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
2fd20 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e  e. */.    if( nN
2fd30 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56  ew==0 && op==SAV
2fd40 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26  EPOINT_RELEASE &
2fd50 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2fd60 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
2fd70 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2fd80 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
2fd90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
2fda0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
2fdb0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  fd, 0);.      pP
2fdc0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
2fdd0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2fde0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fdf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2fe00 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2fe10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fe20 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
2fe30 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
2fe40 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
2fe50 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2fe60 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2fe70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2fe80 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74  n the VFS struct
2fe90 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ure for the page
2fea0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  r..*/.const sqli
2feb0 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
2fec0 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a  PagerVfs(Pager *
2fed0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2fee0 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  n pPager->pVfs;.
2fef0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ff00 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
2ff10 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2ff20 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
2ff30 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67  .** with the pag
2ff40 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
2ff50 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  return NULL if t
2ff60 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e  he file has.** n
2ff70 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2ff80 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66  ed..*/.sqlite3_f
2ff90 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  ile *sqlite3Page
2ffa0 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61  rFile(Pager *pPa
2ffb0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2ffc0 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a  Pager->fd;.}../*
2ffd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
2ffe0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
2fff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30000 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
30010 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
30020 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
30030 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
30040 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
30050 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
30060 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
30070 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
30080 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
30090 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
300a0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
300b0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
300c0 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
300d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
300e0 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
300f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
30100 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
30110 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
30120 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
30130 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20 74  et or retrieve t
30140 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
30150 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69  s pager.*/.stati
30160 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  c void sqlite3Pa
30170 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
30180 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
30190 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
301a0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
301b0 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
301c0 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
301d0 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a  void*,int,int),.
301e0 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
301f0 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76  ree)(void*),.  v
30200 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20  oid *pCodec.){. 
30210 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
30220 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
30230 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
30240 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20  ger->pCodec);.  
30250 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
30260 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
30270 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
30280 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68  g = xCodecSizeCh
30290 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ng;.  pPager->xC
302a0 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65  odecFree = xCode
302b0 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d  cFree;.  pPager-
302c0 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63  >pCodec = pCodec
302d0 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53  ;.  pagerReportS
302e0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73  ize(pPager);.}.s
302f0 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69  tatic void *sqli
30300 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63  te3PagerGetCodec
30310 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30320 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30330 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64  ->pCodec;.}.#end
30340 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
30350 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30360 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
30370 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
30380 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
30390 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
303a0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
303b0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
303c0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
303d0 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
303e0 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
303f0 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
30400 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
30410 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
30420 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
30430 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
30440 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
30450 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
30460 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
30470 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
30480 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
30490 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
304a0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
304b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
304c0 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
304d0 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
304e0 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
304f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
30500 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
30510 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
30520 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
30530 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
30540 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
30550 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
30560 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
30570 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
30580 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
30590 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
305a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
305b0 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
305c0 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
305d0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
305e0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
305f0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
30600 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
30610 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
30620 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
30630 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
30640 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
30650 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
30660 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
30670 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
30680 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
30690 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
306a0 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
306b0 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
306c0 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
306d0 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
306e0 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
306f0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
30700 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
30710 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
30720 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
30730 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
30740 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
30750 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
30760 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
30770 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
30780 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
30790 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
307a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
307b0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
307c0 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
307d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
307e0 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
307f0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  s. Otherwise, it
30800 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
30810 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
30820 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
30830 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
30840 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
30850 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
30860 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
30870 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  PgOld;          
30880 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
30890 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
308a0 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
308b0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20  edSyncPgno = 0; 
308c0 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c        /* Old val
308d0 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c  ue of pPg->pgno,
308e0 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75   if sync is requ
308f0 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ired */.  int rc
30900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30910 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30920 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   code */.  Pgno 
30930 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20  origPgno;       
30940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
30950 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d  riginal page num
30960 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ber */..  assert
30970 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
30980 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
30990 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69  ge being moved i
309a0 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20  s dirty and has 
309b0 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62  not been saved b
309c0 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a  y the latest.  *
309d0 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  * savepoint, the
309e0 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  n save the curre
309f0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
30a00 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
30a10 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e   .  ** sub-journ
30a20 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  al now. This is 
30a30 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
30a40 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  le the following
30a50 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a   scenario:.  **.
30a60 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
30a70 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
30a80 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64  page X, then mod
30a90 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79  ify it in memory
30aa0 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50  >.  **     SAVEP
30ab0 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20  OINT one;.  **  
30ac0 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20       <Move page 
30ad0 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e  X to location Y>
30ae0 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
30af0 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a  CK TO one;.  **.
30b00 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77    ** If page X w
30b10 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  ere not written 
30b20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
30b30 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c  al here, it woul
30b40 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f  d not.  ** be po
30b50 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72  ssible to restor
30b60 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77  e its contents w
30b70 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
30b80 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73  K TO one".  ** s
30b90 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73  tatement were is
30ba0 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a   processed..  **
30bb0 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c  .  ** subjournal
30bc0 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20  Page() may need 
30bd0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
30be0 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e  e to store pPg->
30bf0 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f  pgno into.  ** o
30c00 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
30c10 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68  oint bitvecs. Th
30c20 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e  is is the reason
30c30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
30c40 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
30c50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a  QLITE_NOMEM..  *
30c60 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  /.  if( pPg->fla
30c70 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a  gs&PGHDR_DIRTY .
30c80 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72     && subjRequir
30c90 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26  esPage(pPg).   &
30ca0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
30cb0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
30cc0 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20  e(pPg)).  ){.   
30cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30ce0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
30cf0 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
30d00 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
30d10 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
30d20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
30d30 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
30d40 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
30d50 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
30d60 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54  0, pgno));.  IOT
30d70 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
30d80 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
30d90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
30da0 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ))..  /* If the 
30db0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
30dc0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
30dd0 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
30de0 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
30df0 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
30e00 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
30e10 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
30e20 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
30e30 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
30e40 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
30e50 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
30e60 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
30e70 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
30e80 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
30e90 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
30ea0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
30eb0 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
30ec0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
30ed0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
30ee0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
30ef0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
30f00 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
30f10 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
30f20 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
30f30 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
30f40 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
30f50 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
30f60 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
30f70 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
30f80 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
30f90 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
30fa0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
30fb0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
30fc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30fd0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
30fe0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
30ff0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
31000 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
31010 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
31020 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
31030 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
31040 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
31050 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
31060 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
31070 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
31080 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
31090 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
310a0 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
310b0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
310c0 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
310d0 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  e..  */.  pPg->f
310e0 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
310f0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f  EED_SYNC;.  pPgO
31100 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
31110 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
31120 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
31130 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
31140 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
31150 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
31160 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
31170 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
31180 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
31190 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
311a0 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a  p(pPgOld);.  }..
311b0 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67    origPgno = pPg
311c0 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65  ->pgno;.  sqlite
311d0 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
311e0 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
311f0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
31200 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
31210 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
31220 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
31230 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
31240 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
31250 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
31260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31270 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
31280 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
31290 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
312a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
312b0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
312c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
312d0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
312e0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
312f0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
31300 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
31310 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
31320 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
31330 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
31340 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
31350 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
31360 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
31370 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
31380 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
31390 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
313a0 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
313b0 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
313c0 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
313d0 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
313e0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
313f0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
31400 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
31410 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
31420 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
31430 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
31440 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
31450 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
31460 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
31470 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
31480 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
31490 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
314a0 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
314b0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
314c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
314d0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
314e0 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
314f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
31500 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
31510 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
31520 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
31530 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
31540 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
31550 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
31560 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
31570 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
31580 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
31590 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
315a0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
315b0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
315c0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
315d0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
315e0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
315f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31600 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
31610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31620 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
31630 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
31640 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
31650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31660 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
31670 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
31680 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  & needSyncPgno<=
31690 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
316a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ze ){.        as
316b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54  sert( pPager->pT
316c0 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20  mpSpace!=0 );.  
316d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
316e0 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
316f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
31700 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65  dSyncPgno, pPage
31710 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
31720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
31730 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
31740 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
31750 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  nc = 1;.    asse
31760 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  rt( pPager->noSy
31770 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  nc==0 && !MEMDB 
31780 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66  );.    pPgHdr->f
31790 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
317a0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c  ED_SYNC;.    sql
317b0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
317c0 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
317d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
317e0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
317f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61  .  /*.  ** For a
31800 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
31810 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  base, make sure 
31820 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
31830 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a  e continues.  **
31840 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61   to exist, in ca
31850 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
31860 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c  on needs to roll
31870 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63   back.  We alloc
31880 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ate.  ** the pag
31890 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f  e now, instead o
318a0 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62  f at rollback, b
318b0 65 63 61 75 73 65 20 77 65 20 63 61 6e 20 62 65  ecause we can be
318c0 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77  tter deal.  ** w
318d0 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  ith an out-of-me
318e0 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20  mory error now. 
318f0 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e 0a 20   Ticket #3761.. 
31900 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
31910 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
31920 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  New;.    rc = sq
31930 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
31940 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67 50 67  e(pPager, origPg
31950 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20  no, &pNew, 1);. 
31960 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31970 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
31980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
31990 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20  erUnref(pNew);. 
319a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
319b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
319c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
319d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
319e0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
319f0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
31a00 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
31a10 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
31a20 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
31a30 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
31a40 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
31a50 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
31a60 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
31a70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
31a80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
31a90 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
31aa0 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
31ab0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
31ac0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
31ad0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
31ae0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
31af0 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
31b00 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
31b10 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
31b20 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
31b30 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70  n (pPager?pPg->p
31b40 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Extra:0);.}../*.
31b50 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
31b60 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
31b70 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
31b80 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
31b90 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
31ba0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31bb0 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
31bc0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
31bd0 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
31be0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
31bf0 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
31c00 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
31c10 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
31c20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
31c30 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
31c40 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
31c50 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
31c60 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
31c70 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31c80 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
31c90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31ca0 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
31cb0 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
31cc0 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
31cd0 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
31ce0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
31cf0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
31d00 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
31d10 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
31d20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
31d30 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
31d40 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
31d50 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
31d60 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31d70 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
31d80 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
31d90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31da0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
31db0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
31dc0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
31dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
31de0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31df0 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
31e00 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31e10 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
31e20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
31e30 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
31e40 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
31e50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
31e60 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
31e70 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
31e80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31e90 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
31ea0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
31eb0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
31ec0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
31ed0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
31ee0 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
31ef0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31f00 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
31f10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31f20 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
31f30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31f40 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
31f50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31f60 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
31f70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31f80 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52  _OFF.**    PAGER
31f90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
31fa0 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ORY.**.** If the
31fb0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31fc0 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74  t _QUERY, then t
31fd0 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  he journal_mode 
31fe0 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
31ff0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
32000 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
32010 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20  s allowed.  The 
32020 63 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c  change is disall
32030 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  owed.** for the 
32040 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e  following reason
32050 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  s:.**.**   *  An
32060 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
32070 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76  ase can only hav
32080 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  e its journal_mo
32090 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a  de set to _OFF.*
320a0 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52  *      or _MEMOR
320b0 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68  Y..**.**   *  Th
320c0 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d  e journal mode m
320d0 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ay not be change
320e0 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61  d while a transa
320f0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
32100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
32110 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65  ned indicate the
32120 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
32130 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72  ly updated) jour
32140 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal-mode..*/.int
32150 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
32160 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
32170 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
32180 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
32190 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
321a0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  ALMODE_QUERY.   
321b0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
321c0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
321d0 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
321e0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
321f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32200 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
32210 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32220 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32230 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
32240 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32250 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32260 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
32270 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32280 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32290 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73  E_MEMORY );.  as
322a0 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
322b0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
322c0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
322d0 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20  0.   && (!MEMDB 
322e0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
322f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
32300 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  RY .            
32310 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32320 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
32330 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65 72  F).   && !pPager
32340 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20  ->dbModified.   
32350 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67  && (!isOpen(pPag
32360 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70  er->jfd) || 0==p
32370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
32380 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  f).  ){.    if( 
32390 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
323a0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  fd) ){.      sql
323b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
323c0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
323d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
323e0 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  nalMode = (u8)eM
323f0 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
32400 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
32410 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
32420 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
32430 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64   size-limit used
32440 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
32450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
32460 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65  *.** Setting the
32470 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d   size limit to -
32480 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74  1 means no limit
32490 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a   is enforced..**
324a0 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73   An attempt to s
324b0 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c  et a limit small
324c0 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20  er than -1 is a 
324d0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71  no-op..*/.i64 sq
324e0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
324f0 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72  lSizeLimit(Pager
32500 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c   *pPager, i64 iL
32510 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69  imit){.  if( iLi
32520 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70  mit>=-1 ){.    p
32530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
32540 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  zeLimit = iLimit
32550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
32560 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
32570 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  zeLimit;.}../*.*
32580 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
32590 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72  er to the pPager
325a0 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62  ->pBackup variab
325b0 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d  le. The backup m
325c0 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b  odule.** in back
325d0 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74  up.c maintains t
325e0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
325f0 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69  is variable. Thi
32600 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73  s module.** uses
32610 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20   it opaquely as 
32620 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
32630 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
32640 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  art() and.** sql
32650 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
32660 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69  () only..*/.sqli
32670 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c  te3_backup **sql
32680 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50  ite3PagerBackupP
32690 74 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  tr(Pager *pPager
326a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61  ){.  return &pPa
326b0 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a  ger->pBackup;.}.
326c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
326d0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
326e0 0a                                               .