/ Hex Artifact Content
Login

Artifact d62fd62f7c0ad257019c21158b597fdbb0182529:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 37  : pager.c,v 1.57
0350: 30 20 32 30 30 39 2f 30 32 2f 31 37 20 31 37 3a  0 2009/02/17 17:
0360: 35 36 3a 33 30 20 64 61 6e 69 65 6c 6b 31 39 37  56:30 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1120: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1130: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1140: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1150: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1160: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1170: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1180: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1190: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
11a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
11b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
11c0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
11d0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
11e0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
11f0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
1200: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
1210: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1220: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
1230: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
1240: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1250: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1260: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1290: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
12a0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
12b0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
12c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
12d0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
12e0: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
12f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
1300: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
1310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
1330: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
1340: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
1350: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
1360: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
1370: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1380: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
13a0: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13b0: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
13c0: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
13d0: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
13e0: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
13f0: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1400: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1410: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
1420: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
1430: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1440: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
1450: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
1460: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1470: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1480: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1490: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
14a0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
14b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
14c0: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
14d0: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
14e0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
14f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1500: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1510: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
1520: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1530: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
1540: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
1550: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
1560: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
1570: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1580: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1590: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
15a0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
15b0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
15c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15d0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15e0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
15f0: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1600: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1610: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1620: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
1630: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1640: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
1650: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
1660: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
1670: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1680: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1690: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
16a0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
16b0: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
16c0: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
16d0: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
16e0: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
16f0: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1700: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1710: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
1720: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
1730: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
1760: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
1770: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1780: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1790: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
17a0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
17b0: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
17c0: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
17d0: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
17e0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
17f0: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1810: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
1820: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
1830: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1850: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
1860: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
1870: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1880: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1890: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
18a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
18c0: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
18d0: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
18e0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
18f0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1910: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
1920: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
1930: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
1940: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
1950: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
1960: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
1970: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1980: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1990: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
19a0: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
19b0: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
19c0: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
19d0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
19e0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
19f0: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1a00: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1a10: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
1a20: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
1a30: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
1a40: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
1a50: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
1a60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1a70: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a80: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a90: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1aa0: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1ab0: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1ac0: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1ad0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1ae0: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1af0: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1b00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b10: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1b20: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1b30: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1b40: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1b50: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1b60: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1b70: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b80: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b90: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1ba0: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1bb0: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1bc0: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1bd0: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1be0: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1bf0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1c00: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1c10: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1c20: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1c30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c40: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1c50: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1c60: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1c70: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c80: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c90: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1ca0: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1cb0: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1cc0: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1cd0: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1ce0: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1cf0: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1d00: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1d10: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1d20: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1d30: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1d40: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1d50: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1d60: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1d70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d90: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1da0: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1db0: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1dc0: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1dd0: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1de0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1df0: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1e00: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1e10: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1e20: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1e30: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1e40: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1e50: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1e60: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1e70: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e80: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e90: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1ea0: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1eb0: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1ec0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1ed0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ee0: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1ef0: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1f00: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1f10: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1f20: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1f30: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1f40: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1f50: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1f60: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1f70: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f80: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f90: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1fa0: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1fb0: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1fc0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1fd0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1fe0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1ff0: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
2000: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
2010: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
2020: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
2030: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
2040: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2050: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
2060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2070: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2080: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2090: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
20a0: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
20b0: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
20c0: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
20d0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
20e0: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
20f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2100: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2110: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
2120: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
2130: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
2140: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
2150: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
2160: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
2170: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2180: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2190: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
21a0: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
21c0: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
21d0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
21e0: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
21f0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2200: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2210: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
2220: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
2230: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
2240: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
2250: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
2260: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
2270: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2280: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2290: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
22a0: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
22b0: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
22c0: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
22d0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
22e0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
22f0: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2300: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2310: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
2320: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
2330: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
2340: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
2350: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
2360: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
2370: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2380: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2390: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
23a0: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
23b0: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
23c0: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
23d0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
23e0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
23f0: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2400: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2410: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
2420: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
2430: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
2440: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
2450: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
2460: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
2470: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2480: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2490: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
24a0: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
24b0: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
24c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
24d0: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
24e0: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
24f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2500: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2510: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
2520: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2530: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
2540: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
2550: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
2560: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
2570: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2580: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2590: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
25a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25b0: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
25c0: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
25d0: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
25e0: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
25f0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2600: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2610: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
2620: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
2630: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
2640: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
2650: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
2660: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
2670: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2680: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2690: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
26a0: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
26b0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
26c0: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
26d0: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
26e0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
26f0: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2700: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2710: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
2720: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
2730: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
2740: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
2760: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
2770: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2780: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2790: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
27a0: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
27b0: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
27c0: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
27d0: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
27e0: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
27f0: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2800: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2810: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
2820: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
2830: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
2840: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
2850: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
2860: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
2870: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2880: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2890: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
28a0: 75 72 6e 61 6c 22 2e 0a 2a 2f 0a 73 74 72 75 63  urnal"..*/.struc
28b0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28c0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
28e0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
28f0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2900: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2910: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2920: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2930: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2940: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2950: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2960: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2970: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2980: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
2990: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29c0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29d0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
29e0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
29f0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a00: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a10: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a20: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a40: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a50: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a60: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a80: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2a90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2aa0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ab0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ac0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2ad0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2ae0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2af0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b00: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b10: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b20: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b30: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b40: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b60: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b70: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2b80: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ba0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bb0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2bc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bd0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2be0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2bf0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c00: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c10: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c20: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c30: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c40: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c50: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c60: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c70: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2c80: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2c90: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2ca0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2cc0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cd0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2ce0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2cf0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d00: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d10: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d20: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d30: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d40: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d50: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d60: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d70: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2d80: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2d90: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2da0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2db0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2dc0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2dd0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2de0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2df0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e00: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e20: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e30: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e40: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e50: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e70: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2e80: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2e90: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ea0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2eb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ec0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ed0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2ee0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2ef0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f10: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f20: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2f80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fb0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fc0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2fd0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
2fe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2ff0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3000: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3010: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3020: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3030: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3040: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3050: 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  rrect */.  Pgno 
3060: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
3070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3080: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3090: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
30a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
30c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
30d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
30e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
30f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
3100: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3120: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
3130: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3150: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
3160: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
3170: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
31a0: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
31b0: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
31c0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
31d0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
31e0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
31f0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
3200: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
3210: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3240: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
3250: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
3260: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
3270: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
3280: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
3290: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
32a0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
32b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
32c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
32d0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
32e0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
32f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3300: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
3310: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3320: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
3330: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
3340: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
3350: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3360: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
3370: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
3380: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
3390: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
33a0: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
33b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
33c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
33d0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
33e0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
33f0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
3400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
3410: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
3420: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
3430: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
3440: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
3450: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
3460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3470: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3480: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
3490: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
34a0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
34b0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
34c0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
34d0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
34e0: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
34f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3500: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
3510: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
3520: 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e 74  llback */..  int
3530: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
3540: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
3550: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
3560: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
3570: 79 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  y page */.  u32 
3580: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
3590: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
35a0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
35b0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  .xOpen() */.  in
35c0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
35d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
35f0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
3600: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
3610: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3620: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
3630: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3640: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3650: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3660: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3670: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3680: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3690: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
36a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
36b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
36c0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
36d0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
36e0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
36f0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
3700: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
3710: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
3720: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
3730: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
3740: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3750: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
3760: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
3770: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
3780: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
3790: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
37a0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
37b0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
37c0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
37d0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
37e0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
37f0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
3800: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3810: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
3820: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3830: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
3840: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
3850: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3860: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3870: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3880: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3890: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
38a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
38b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
38c0: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  () */.#endif.  c
38d0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
38e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
38f0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
3900: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
3910: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36 34  tmp use */.  i64
3920: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
3930: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
3940: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
3950: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
3960: 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  les */.  PCache 
3970: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
3980: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3990: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
39a0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
39b0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
39c0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
39d0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
39e0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
39f0: 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sses */.};../*.*
3a00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3a10: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
3a20: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
3a30: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
3a40: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
3a50: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
3a60: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
3a70: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
3a80: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
3a90: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
3aa0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
3ab0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3ac0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
3ad0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
3ae0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3af0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3b00: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
3b10: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3b20: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
3b30: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
3b40: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
3b50: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3b60: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3b70: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
3b80: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
3b90: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3ba0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
3bb0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
3bc0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
3bd0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
3be0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
3bf0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
3c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
3c10: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
3c20: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
3c30: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
3c40: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
3c50: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
3c60: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
3c70: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3c80: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3c90: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3ca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3cb0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3cc0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3cd0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3ce0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3cf0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
3d10: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
3d20: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
3d30: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
3d40: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
3d50: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
3d60: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
3d70: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3d80: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3d90: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3da0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3dc0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3dd0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3de0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3df0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3e00: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3e10: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
3e20: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3e30: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
3e40: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
3e50: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e60: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
3e70: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
3e80: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
3e90: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3ea0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
3eb0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
3ec0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
3ed0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
3ee0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
3ef0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
3f00: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
3f10: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
3f20: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
3f30: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
3f40: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
3f50: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
3f60: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
3f70: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
3f80: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
3f90: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
3fa0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
3fb0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
3fc0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
3fd0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
3fe0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
3ff0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
4000: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
4010: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
4020: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
4030: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
4040: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
4050: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
4060: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
4070: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
4080: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
4090: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
40a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
40b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
40c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
40d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
40e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
40f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
4100: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
4110: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
4120: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
4130: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
4140: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
4150: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
4160: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
4170: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
4180: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
4190: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
41a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
41b0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
41c0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
41d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
41e0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
41f0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4200: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4210: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
4220: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
4230: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
4240: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
4250: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
4260: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
4270: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
4280: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
4290: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
42a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
42b0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
42c0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
42d0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
42e0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
42f0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4300: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4310: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
4320: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4330: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4340: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4350: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4360: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4370: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4380: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4390: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
43a0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
43b0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
43c0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
43d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
43e0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
43f0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4400: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
4410: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
4420: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4430: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
4440: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4450: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4460: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4470: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4480: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
4490: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
44a0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
44b0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
44c0: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
44d0: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
44e0: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
44f0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
4500: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
4510: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
4520: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
4530: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
4540: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
4550: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
4560: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
4570: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
4580: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
4590: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
45a0: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
45b0: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
45c0: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
45d0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
45e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
45f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
4600: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
4610: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4620: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
4630: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
4640: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
4650: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
4660: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
4670: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
4680: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
4690: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
46a0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
46b0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
46c0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
46d0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
46e0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
46f0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
4700: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
4710: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
4720: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
4730: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
4740: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
4750: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
4760: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
4770: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
4780: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
4790: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
47a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
47b0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
47c0: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
47d0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
47e0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
47f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4800: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
4810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
4820: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
4830: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
4840: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
4850: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
4860: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
4870: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
4880: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
4890: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
48a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
48b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
48c0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
48d0: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
48e0: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
48f0: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
4900: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
4910: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
4920: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4930: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
4940: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
4950: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
4960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4970: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4980: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
4990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
49a0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
49b0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
49c0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
49d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
49e0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
49f0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
4a00: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4a10: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4a20: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
4a30: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
4a40: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
4a50: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
4a60: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
4a70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4a80: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4a90: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4aa0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4ab0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4ac0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4ad0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
4ae0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
4af0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4b00: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
4b10: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
4b20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4b30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b50: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4b60: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4b70: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4b80: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
4b90: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
4ba0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
4bb0: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
4bc0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4bd0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4be0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4bf0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4c00: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4c10: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4c20: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4c30: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
4c40: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
4c50: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
4c60: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
4c70: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
4c80: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
4c90: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
4ca0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4cb0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4cc0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
4cd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
4ce0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
4cf0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
4d00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
4d10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
4d20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
4d30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
4d40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
4d50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
4d60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
4d70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
4d80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
4d90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
4da0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
4db0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
4dc0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
4dd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
4de0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
4df0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
4e00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
4e10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
4e20: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
4e30: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
4e40: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
4e50: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
4e60: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
4e70: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
4e80: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
4e90: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
4ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4eb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
4ec0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
4ed0: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
4ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
4ef0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
4f00: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
4f10: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
4f20: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
4f30: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
4f40: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
4f50: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
4f60: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
4f70: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
4f80: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
4f90: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
4fa0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
4fb0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
4fc0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
4fd0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
4fe0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
4ff0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
5000: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
5010: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
5020: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5030: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
5040: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
5050: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
5060: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
5070: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
5080: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
5090: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
50a0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
50b0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
50c0: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
50d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
50e0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
50f0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
5100: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
5110: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
5120: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
5130: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
5140: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
5150: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
5160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5170: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
5180: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
5190: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
51a0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
51b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
51c0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
51d0: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
51e0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
51f0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
5200: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
5210: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
5220: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
5230: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5250: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
5260: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
5270: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
52a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
52b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
52c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
52d0: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
52e0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
52f0: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
5300: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
5310: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
5320: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
5330: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
5340: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5350: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
5360: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5370: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
5380: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5390: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
53a0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
53b0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
53c0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
53d0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
53e0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
53f0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
5400: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
5410: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
5420: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
5430: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
5440: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5450: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
5460: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
5470: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
5480: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5490: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
54a0: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
54b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
54c0: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
54d0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
54e0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
54f0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
5500: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
5510: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
5520: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5530: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
5540: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
5550: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
5560: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
5570: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
5580: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
5590: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
55a0: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
55b0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
55c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
55d0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
55e0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
55f0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
5600: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
5610: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
5620: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
5630: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
5640: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
5650: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
5660: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
5670: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
5680: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
5690: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
56a0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
56b0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
56c0: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
56d0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
56e0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
56f0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5700: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
5710: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
5720: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
5730: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
5740: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
5750: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
5760: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5770: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5780: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5790: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
57a0: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
57b0: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
57c0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
57d0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
57e0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
57f0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5800: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
5810: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
5820: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
5830: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
5840: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
5850: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
5860: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
5870: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
5880: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
5890: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
58a0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
58b0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
58c0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
58d0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
58e0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
58f0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
5900: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
5910: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
5920: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
5930: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
5940: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
5950: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
5960: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
5970: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
5980: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
5990: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
59a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
59b0: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
59c0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
59d0: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
59e0: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
59f0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
5a00: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
5a10: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
5a20: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
5a30: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
5a40: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
5a50: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
5a60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5a70: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
5a80: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
5a90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
5aa0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
5ab0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
5ac0: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
5ad0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
5ae0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
5af0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
5b00: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
5b10: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
5b20: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
5b30: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
5b40: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
5b50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
5b60: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
5b70: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
5b90: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
5ba0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
5bb0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
5bc0: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
5bd0: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
5be0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
5bf0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
5c00: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
5c10: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
5c20: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
5c30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c40: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
5c50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
5c60: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
5c70: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
5c80: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
5c90: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
5ca0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
5cb0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
5cc0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
5cd0: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
5ce0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
5cf0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
5d00: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
5d10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
5d20: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
5d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5d40: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
5d50: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5d60: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
5d70: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
5d80: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
5d90: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
5da0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
5db0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
5dc0: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
5dd0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5df0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5e00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5e10: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
5e20: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
5e30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
5e60: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e80: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
5e90: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
5ea0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
5eb0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
5ed0: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
5ee0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
5ef0: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
5f00: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
5f10: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
5f20: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
5f30: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
5f40: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f60: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
5f70: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
5f80: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5f90: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
5fa0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
5fb0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
5fc0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
5fd0: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
5fe0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
5ff0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
6000: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
6010: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
6020: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
6030: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
6040: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
6050: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
6060: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
6070: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
6080: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
6090: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
60a0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
60b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
60c0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
60d0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
60e0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
60f0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6100: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
6110: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
6120: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
6130: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
6140: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
6150: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6160: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
6170: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
6180: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
6190: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
61a0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
61b0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
61c0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
61d0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
61e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
61f0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
6200: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
6210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
6220: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
6230: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
6240: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
6250: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
6260: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
6270: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
6280: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
6290: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
62a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
62b0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
62c0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
62d0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
62e0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
62f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
6300: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
6310: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
6320: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6330: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6340: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
6350: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
6360: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
6370: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
6380: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
6390: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
63a0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
63b0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
63c0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
63d0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
63e0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
63f0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
6400: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
6410: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
6420: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
64c0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
64d0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
64e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
64f0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
6500: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6510: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
6520: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
6530: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
6540: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
6550: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
6580: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6590: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
65a0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
65b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
65c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
65d0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
65e0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
65f0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
6600: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
6610: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
6620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
6630: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
6640: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
6650: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6660: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
6670: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
6680: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
6690: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
66a0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
66b0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
66c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
66d0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
66e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
66f0: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
6700: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
6710: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
6720: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
6730: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
6740: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
6750: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
6760: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
6770: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
6780: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
6790: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
67a0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
67b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
67c0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
67d0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
67e0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
67f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
6800: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
6810: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
6820: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
6830: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
6840: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
6850: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
6860: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
6870: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
6880: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
6890: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
68a0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
68b0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
68c0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
68d0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
68e0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
68f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
6900: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
6910: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
6920: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
6930: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
6940: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
6950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
6960: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
6970: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
6980: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
6990: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
69a0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
69b0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
69c0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
69d0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
69e0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
69f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a00: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6a10: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
6a20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
6a30: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
6a40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6a50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6a80: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
6a90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
6aa0: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
6ab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6ac0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
6ad0: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
6ae0: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
6af0: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
6b00: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
6b10: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
6b20: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
6b30: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
6b40: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
6b50: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6b70: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6b80: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
6b90: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
6ba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
6bb0: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
6bc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6bd0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
6be0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
6bf0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
6c00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
6c10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c20: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
6c30: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
6c40: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
6c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
6c60: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
6c70: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
6c80: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
6c90: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
6ca0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
6cb0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
6cc0: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
6cd0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
6ce0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
6cf0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
6d00: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
6d10: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
6d20: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
6d30: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
6d40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6d50: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
6d60: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
6d70: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
6d80: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
6d90: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
6da0: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
6db0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
6dc0: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
6dd0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6de0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
6df0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6e00: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
6e10: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6e30: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
6e40: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
6e50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6e60: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
6e70: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
6e80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
6e90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
6ea0: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
6eb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6ed0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
6ee0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
6ef0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
6f00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
6f10: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
6f20: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
6f30: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
6f40: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
6f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
6f60: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
6f70: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
6f80: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
6f90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6fa0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
6fb0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
6fc0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
6fd0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
6fe0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
6ff0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
7000: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
7010: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
7020: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
7030: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
7040: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
7050: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
7060: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
7070: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
7080: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
7090: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
70a0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
70b0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
70c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
70d0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
70e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
70f0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
7100: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
7110: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
7120: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
7130: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
7140: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
7150: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
7160: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7180: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7190: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
71a0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
71b0: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
71c0: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
71d0: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
71e0: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
71f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7200: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
7210: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
7220: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
7230: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7260: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
7270: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
7280: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
72b0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
72c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
72d0: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
72e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
72f0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
7300: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
7310: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7320: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
7330: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
7340: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7350: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
7360: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
7370: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
7380: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
7390: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
73a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
73b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
73c0: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
73d0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
73e0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
73f0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
7400: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
7410: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
7420: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
7430: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7440: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
7450: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
7460: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
7470: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
7480: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
7490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
74a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
74b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
74c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
74d0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
74e0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
74f0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
7500: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
7510: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7520: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
7530: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
7540: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
7550: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
7560: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
7570: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
7580: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
7590: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
75a0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
75b0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
75c0: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
75d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
75e0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
75f0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
7600: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
7610: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
7620: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
7630: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
7640: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
7650: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
7660: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
7670: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
7680: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
7690: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
76a0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
76b0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
76c0: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
76d0: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
76e0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
76f0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
7700: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
7710: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
7720: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
7730: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
7740: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
7750: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
7760: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
7770: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
7780: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
7790: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
77a0: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
77b0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
77c0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
77d0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
77e0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
77f0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
7800: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
7810: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
7820: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
7830: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
7840: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
7850: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
7860: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
7870: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
7880: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
7890: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
78a0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
78b0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
78c0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
78d0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
78e0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
78f0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
7900: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
7910: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
7920: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
7930: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
7940: 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
7950: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
7960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
7970: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
7980: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
7990: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
79a0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
79b0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
79c0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
79d0: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
79e0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
79f0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7a00: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7a10: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
7a20: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
7a30: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7a40: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7a50: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
7a60: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
7a70: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
7a80: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
7a90: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
7aa0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
7ab0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
7ac0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
7ad0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7ae0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7af0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
7b00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7b10: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
7b20: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
7b30: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7b40: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7b50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
7b60: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
7b70: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7b80: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7b90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7ba0: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
7bb0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7bc0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7bd0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
7be0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
7bf0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
7c00: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7c10: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7c20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7c30: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
7c40: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
7c50: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
7c60: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
7c70: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
7c80: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
7c90: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
7ca0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
7cb0: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
7cc0: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
7cd0: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
7ce0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
7cf0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
7d00: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
7d10: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
7d20: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
7d30: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
7d40: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
7d50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7d60: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
7d70: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
7d80: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
7d90: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
7da0: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
7db0: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
7dc0: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
7dd0: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
7de0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
7df0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
7e00: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
7e10: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
7e20: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
7e30: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
7e40: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
7e50: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
7e60: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
7e70: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
7e80: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
7e90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
7ea0: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
7eb0: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
7ec0: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
7ed0: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
7ee0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
7ef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
7f00: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
7f10: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
7f20: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
7f30: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
7f40: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
7f50: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
7f60: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
7f70: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
7f80: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
7f90: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
7fa0: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
7fb0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
7fc0: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
7fd0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
7fe0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
7ff0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
8000: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
8010: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
8020: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
8030: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
8040: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
8050: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
8060: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
8070: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
8080: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
8090: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
80a0: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
80b0: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
80c0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
80d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
80e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
80f0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
8100: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
8110: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
8120: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
8130: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
8140: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
8150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
8160: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
8170: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
8180: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
8190: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
81a0: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
81b0: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
81c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
81d0: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
81e0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
81f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
8200: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
8210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8220: 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  f);.    pPager->
8230: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
8240: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
8250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8260: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
8270: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
8280: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
8290: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
82a0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
82b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
82c0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
82d0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
82e0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
82f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
8300: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8310: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
8320: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
8330: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
8340: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
8350: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
8360: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
8370: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
8380: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
8390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
83a0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
83b0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
83c0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
83d0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
83e0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
83f0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
8400: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
8410: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
8420: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
8430: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
8440: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
8450: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
8460: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
8470: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
8480: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
8490: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
84a0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
84b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
84c0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
84d0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
84e0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
84f0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
8500: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
8510: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
8520: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
8530: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
8540: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
8550: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
8560: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
8570: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
8580: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
8590: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
85a0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
85b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
85c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
85d0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
85e0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8600: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
8610: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8620: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8630: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8640: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
8650: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
8660: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8680: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
8690: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
86a0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
86b0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
86c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
86d0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
86e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
86f0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8700: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8710: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8720: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8730: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8740: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
8750: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
8760: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
8770: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
87a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
87b0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
87c0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
87d0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
87e0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
87f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8800: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8810: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8820: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8830: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
8840: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
8850: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
8860: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
8870: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
8880: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
8890: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
88a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
88b0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
88c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
88d0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
88e0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
88f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8900: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8910: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8920: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8930: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8940: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8960: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8970: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8980: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8990: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
89a0: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
89b0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
89c0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
89d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
89e0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
89f0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8a00: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8a10: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8a20: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8a30: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8a40: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8a50: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
8a60: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8a70: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8a80: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8a90: 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66 28 20  iHdrOff);.  if( 
8aa0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8ab0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d   rc;.  }.  if( m
8ac0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8ad0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8ae0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8af0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
8b10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8b20: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8b30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8b40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8b50: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8b60: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8b70: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8b80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8b90: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8ba0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8bb0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8bc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8bd0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8be0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8bf0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8c00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8c10: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8c20: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8c30: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8c40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8c60: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8c70: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8c80: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8c90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ca0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8cb0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8cc0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8cd0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8ce0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8cf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8d00: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8d20: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8d30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8d40: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8d50: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8d60: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8d70: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8d80: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8d90: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8da0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8db0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8dc0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8dd0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8de0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8df0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8e00: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8e10: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8e20: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8e30: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8e40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8e50: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
8e60: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
8e70: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e80: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8ea0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
8eb0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
8ec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8ed0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8ee0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
8ef0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
8f00: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
8f10: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
8f20: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
8f30: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
8f40: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
8f50: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
8f60: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
8f70: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
8f80: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8f90: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
8fa0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
8fb0: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
8fc0: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
8fd0: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
8fe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ff0: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9010: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9020: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9030: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9040: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
9050: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9060: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9070: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9080: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9090: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
90a0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
90b0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
90c0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
90d0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
90e0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
90f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9100: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9110: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9120: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9130: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
9140: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
9150: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9160: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9170: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9180: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9190: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
91a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
91b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
91c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
91d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
91e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
91f0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9200: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9210: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9220: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9230: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
9240: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
9250: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9260: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9270: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9280: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9290: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
92a0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
92b0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
92c0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
92d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
92e0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
92f0: 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20 20 20  PageSize16);.   
9300: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
9310: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9320: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9330: 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69  TE_OK || iPageSi
9340: 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65  ze16==(u16)iPage
9350: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
9360: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
9370: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
9380: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
9390: 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
93a0: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
93b0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
93c0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
93d0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
93e0: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
93f0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
9400: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
9410: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
9420: 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
9430: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
9440: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
9450: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
9460: 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
9470: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
9480: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
9490: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
94a0: 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
94b0: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
94c0: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
94d0: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
94e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
94f0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9500: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
9510: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
9520: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
9530: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
9540: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
9550: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
9560: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
9570: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
9580: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
9590: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
95a0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
95b0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
95c0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
95d0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
95e0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
95f0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
9600: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
9610: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
9620: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
9630: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
9640: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
9650: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
9660: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
9670: 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
9680: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
9690: 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
96a0: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
96b0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
96c0: 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
96d0: 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
96e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
96f0: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
9700: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
9710: 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
9720: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
9730: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
9740: 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
9750: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
9760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
9770: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
9780: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
9790: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
97a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
97b0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
97c0: 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
97d0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
97e0: 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
97f0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
9800: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
9810: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
9820: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
9830: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
9840: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
9850: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
9860: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
9870: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
9880: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
9890: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
98a0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
98d0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
98e0: 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
9910: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9920: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
9950: 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
9960: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
9970: 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9990: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
99a0: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
99b0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
99e0: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
99f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   */..  if( !zMas
9a00: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
9a10: 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70  etMaster.   || p
9a20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9a40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9a50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9a60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9a80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9a90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9aa0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9ab0: 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
9ac0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9ad0: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9ae0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
9af0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
9b00: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
9b20: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
9b30: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
9b40: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
9b50: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
9b60: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
9b70: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
9b80: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
9b90: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
9ba0: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
9bb0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
9bc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9bd0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
9be0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
9bf0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
9c00: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
9c10: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
9c20: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
9c30: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9c40: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
9c50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c60: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
9c70: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
9c80: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9c90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9ca0: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
9cb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9cc0: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
9cd0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9ce0: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
9cf0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9d00: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
9d10: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
9d20: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
9d30: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9d40: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9d50: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
9d60: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9d70: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
9d80: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
9d90: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9da0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
9db0: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
9dc0: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
9dd0: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
9de0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9df0: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
9e00: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
9e10: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9e20: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9e30: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9e40: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
9e50: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
9e60: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
9e70: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9e80: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
9e90: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
9ea0: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
9eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9ec0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9ed0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
9ee0: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
9ef0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9f00: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
9f10: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9f20: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
9f30: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
9f40: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
9f50: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
9f60: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
9f70: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
9f80: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
9f90: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
9fa0: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
9fb0: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
9fc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
9fd0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
9fe0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
9ff0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
a000: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
a010: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
a020: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
a030: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
a040: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
a050: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
a060: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
a070: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
a080: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
a090: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
a0a0: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
a0b0: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
a0c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
a0d0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
a0e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
a0f0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
a100: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
a110: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a120: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
a130: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
a140: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
a150: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
a160: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
a170: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a180: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a1a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
a1c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
a1d0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
a1e0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
a1f0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
a200: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
a210: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
a220: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
a230: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
a240: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
a250: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
a260: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
a270: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
a280: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a2b0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
a2c0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
a2d0: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
a2e0: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
a2f0: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
a300: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
a310: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
a320: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
a330: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
a340: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
a350: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
a360: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
a370: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
a380: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
a390: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
a3a0: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
a3b0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a3c0: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
a3d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
a3e0: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
a3f0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a400: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
a410: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
a420: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
a430: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
a440: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
a450: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
a460: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
a470: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
a480: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
a490: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
a4a0: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
a4b0: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
a4c0: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
a4d0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
a4e0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
a4f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
a510: 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
a520: 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
a530: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
a540: 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
a550: 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
a560: 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
a570: 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
a580: 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
a590: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
a5a0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
a5b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
a5c0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
a5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a5e0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
a5f0: 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
a600: 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a620: 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
a630: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
a640: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
a650: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
a660: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
a670: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
a680: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
a690: 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
a6a0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
a6b0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
a6c0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
a6d0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
a6e0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a6f0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
a700: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a710: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
a720: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
a730: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
a740: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
a750: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
a760: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
a770: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
a780: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
a790: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
a7a0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
a7b0: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
a7c0: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
a7d0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
a7e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
a7f0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
a800: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
a810: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
a820: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
a830: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
a840: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
a850: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a860: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
a870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a880: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a890: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
a8a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
a8b0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
a8c0: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
a8d0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
a8e0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
a8f0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
a900: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
a910: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
a920: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
a930: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
a940: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
a950: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
a960: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
a970: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a980: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a990: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a9b0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
a9c0: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
a9d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a9e0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
a9f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
aa00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
aa10: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
aa20: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
aa30: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
aa40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
aa50: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
aa60: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
aa70: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
aa80: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
aa90: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
aaa0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
aab0: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
aac0: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
aad0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
aae0: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
aaf0: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
ab00: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
ab10: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
ab20: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
ab30: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
ab40: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
ab50: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
ab60: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
ab70: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
ab80: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
ab90: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
aba0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
abb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
abc0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
abd0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
ac00: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
ac10: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
ac20: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
ac30: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
ac40: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
ac50: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
ac60: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
ac70: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
ac80: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
ac90: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
aca0: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
acb0: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
acc0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
acd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
ace0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
acf0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ad00: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ad10: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
ad20: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
ad30: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
ad40: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
ad50: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
ad60: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
ad70: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
ad80: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
ad90: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
ada0: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
adb0: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
adc0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
add0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
ade0: 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c  pens. TODO: Real
adf0: 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74  ly, this doesn't
ae00: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
ae10: 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c  red.    ** until
ae20: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
ae30: 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20  ter check fails 
ae40: 69 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  in pagerSharedLo
ae50: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
ae60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
ae70: 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72  alid = 0;..    r
ae80: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
ae90: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
aea0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
aeb0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
aec0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
aed0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
aee0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
aef0: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
af00: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
af10: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
af20: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
af30: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
af40: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
af50: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
af60: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
af70: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
af80: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
af90: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
afa0: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
afb0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
afc0: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
afd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
afe0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
aff0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b010: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b020: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
b030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
b040: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
b050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
b060: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
b070: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
b080: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
b090: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
b0a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b0b0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
b0c0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
b0d0: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
b0e0: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
b0f0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64  may have occured
b100: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
b110: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
b120: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a  r to the pager .
b130: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
b140: 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  e second the err
b150: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
b160: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
b170: 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20  a pager .** API 
b180: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
b190: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
b1a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
b1b0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a  cond argument .*
b1c0: 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
b1d0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
b1e0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b1f0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
b200: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
b210: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
b220: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
b230: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
b240: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
b250: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
b260: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
b270: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
b280: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
b290: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
b2a0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
b2b0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
b2c0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
b2d0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
b2e0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
b2f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b300: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
b310: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
b320: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
b330: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
b340: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
b350: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
b360: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b370: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
b380: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
b390: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
b3a0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b3b0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
b3c0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b3d0: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b3e0: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b3f0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b400: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b410: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b420: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b430: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b440: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b450: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b460: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b470: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b480: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b490: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b4a0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b4b0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b4c0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b4d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b4e0: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b4f0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b500: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b510: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b520: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b530: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b540: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b550: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b560: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b570: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b580: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b590: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b5a0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b5b0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b5c0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b5d0: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b5e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b5f0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b600: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b610: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b620: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b630: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b640: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b650: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b660: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b670: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b680: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b690: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b6a0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b6b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6c0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b6d0: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b6e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b6f0: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b700: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b710: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b720: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b730: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b740: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b750: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b760: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b770: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b780: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b790: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b7a0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b7b0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
b7c0: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
b7d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
b7e0: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
b7f0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
b800: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
b810: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
b820: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
b830: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
b840: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
b850: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
b860: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
b870: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
b880: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
b890: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
b8a0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
b8b0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
b8c0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
b8d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
b8e0: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b8f0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b900: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
b910: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
b920: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
b930: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
b940: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
b950: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
b960: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
b970: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
b980: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
b990: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
b9a0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
b9b0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
b9c0: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
b9d0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
b9e0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
b9f0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ba00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ba10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
ba20: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
ba30: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
ba40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ba50: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
ba60: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
ba70: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
ba80: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
ba90: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
baa0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bab0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bad0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bae0: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
baf0: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bb00: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bb10: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bb20: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bb30: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bb40: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bb50: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bb60: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bb70: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bb80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bb90: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbb0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
bbc0: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
bbd0: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
bbe0: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
bbf0: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
bc00: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
bc10: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
bc20: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
bc30: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
bc40: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
bc50: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bc60: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
bc70: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bc80: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bc90: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bca0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bcb0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bcc0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bcd0: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bce0: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bcf0: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bd00: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bd10: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bd20: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bd30: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bd40: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bd50: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bd60: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bd70: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bd80: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bd90: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bda0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bdb0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
bdc0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
bdd0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
bde0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
bdf0: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
be00: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
be10: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
be20: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
be30: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
be40: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
be50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
be60: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
be70: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
be80: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
be90: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
bea0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
beb0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
bec0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
bed0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
bee0: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
bef0: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bf00: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
bf10: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
bf20: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
bf30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
bf40: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
bf50: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
bf60: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bf70: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
bf80: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
bf90: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
bfa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bfb0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
bfc0: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
bfd0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
bfe0: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
bff0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c000: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c010: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c020: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c030: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c040: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c050: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c060: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c070: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c080: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c090: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c0a0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c0b0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c0c0: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0e0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c0f0: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c100: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c110: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c120: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c130: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c140: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c150: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c160: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c170: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c180: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c190: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c1a0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c1b0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c1c0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c1d0: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c1e0: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c1f0: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c200: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c210: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c220: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c230: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c250: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c260: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c270: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c280: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c290: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c2a0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c2b0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c2c0: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c2d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c2e0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c2f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c300: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c310: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c320: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c330: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c340: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c350: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c360: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c370: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c380: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c390: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c3a0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c3b0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c3c0: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c3d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c3e0: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c3f0: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c400: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c410: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c420: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c430: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c440: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c450: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c460: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c470: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c480: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c490: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c4a0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c4b0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c4c0: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c4d0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c4e0: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c4f0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c510: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c530: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c540: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c550: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c560: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c570: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c580: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c590: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c5a0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c5b0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c5c0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c5d0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c5f0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c600: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c610: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c620: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c630: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c640: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c650: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c660: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c670: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c680: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c690: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c6a0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c6b0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c6c0: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c6d0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c6e0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c6f0: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c700: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c710: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c720: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c730: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c740: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c750: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c760: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c770: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c780: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c790: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c7a0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c7b0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
c7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
c7d0: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
c7e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c7f0: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
c800: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
c810: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
c820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c830: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
c840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c850: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c860: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
c870: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
c880: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
c890: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
c8a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c8b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c8c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c8d0: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
c8e0: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
c8f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c900: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
c910: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
c920: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
c930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
c950: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
c960: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
c970: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 72 63  CATE ){.      rc
c980: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
c990: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
c9a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
c9b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c9c0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
c9d0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
c9e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
c9f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
ca00: 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20  usiveMode .     
ca10: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ca20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ca30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ca40: 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  T.    ){.      r
ca50: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
ca60: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
ca70: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
ca80: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
ca90: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
caa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
cab0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
cac0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
cad0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
cae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
caf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
cb00: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
cb10: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20  LMODE_DELETE || 
cb20: 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rc );.      sqli
cb30: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
cb40: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
cb50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cb60: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
cb70: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
cb80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
cb90: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
cba0: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
cbb0: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
cbc0: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
cbd0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cbe0: 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ES.    sqlite3Pc
cbf0: 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
cc00: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
cc10: 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
cc20: 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  hash);.#endif.. 
cc30: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
cc40: 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
cc50: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 73  >pPCache);.    s
cc60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
cc70: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
cc80: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
cc90: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
cca0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
ccb0: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >nRec = 0;.  }..
ccc0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
ccd0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
cce0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
ccf0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
cd00: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
cd10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
cd20: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
cd30: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
cd40: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
cd50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
cd60: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
cd70: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
cd80: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
cd90: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
cda0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
cdb0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
cdc0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
cdd0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
cde0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
cdf0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68    /* TODO: Is th
ce00: 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20  is optimal? Why 
ce10: 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69  is the db size i
ce20: 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20  nvalidated here 
ce30: 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64  .  ** when the d
ce40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
ce50: 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f  not unlocked? */
ce60: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
ce70: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  gSize = 0;.  sql
ce80: 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
ce90: 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
cea0: 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
ceb0: 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ze);.  if( !MEMD
cec0: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
ced0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
cee0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
cef0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
cf00: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
cf10: 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
cf20: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
cf30: 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
cf40: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
cf50: 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
cf60: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
cf70: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
cf80: 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
cf90: 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
cfa0: 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
cfb0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
cfc0: 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
cfd0: 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
cfe0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
cff0: 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
d000: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
d010: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
d020: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
d030: 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
d040: 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
d050: 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
d060: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
d070: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
d080: 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
d090: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
d0a0: 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
d0b0: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
d0c0: 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
d0d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
d0e0: 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
d0f0: 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
d100: 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
d110: 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
d120: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
d130: 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
d140: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
d150: 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
d160: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
d170: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
d180: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
d190: 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
d1a0: 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
d1b0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
d1c0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
d1d0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
d1e0: 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
d1f0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
d200: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
d210: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
d220: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
d230: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
d240: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
d250: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
d260: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
d270: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
d280: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
d290: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
d2a0: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
d2b0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
d2c0: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
d2d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d2e0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
d2f0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
d300: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d310: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
d320: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
d330: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
d340: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
d350: 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
d360: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d370: 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
d380: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
d390: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
d3a0: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
d3b0: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
d3c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
d3d0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
d3e0: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
d3f0: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
d400: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
d410: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
d420: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
d430: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
d440: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
d450: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
d460: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
d470: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
d480: 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
d490: 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
d4a0: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
d4b0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
d4c0: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
d4d0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
d4e0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
d4f0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
d500: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
d510: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
d520: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
d530: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d540: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
d550: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d560: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
d570: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
d580: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
d590: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
d5a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
d5b0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d5c0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d5d0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d5e0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
d5f0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
d600: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
d610: 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
d620: 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
d630: 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
d640: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
d650: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
d660: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
d670: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
d680: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
d690: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
d6a0: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
d6b0: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
d6c0: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
d6d0: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
d6e0: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
d6f0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
d700: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
d710: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
d720: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
d730: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
d740: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
d750: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
d760: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
d770: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
d780: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
d790: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
d7a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
d7b0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d7c0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
d7d0: 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
d7e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
d7f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
d800: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d810: 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
d820: 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
d830: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
d840: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
d850: 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
d860: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d870: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
d880: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
d890: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
d8a0: 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
d8b0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
d8c0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d8d0: 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
d8e0: 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
d8f0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
d900: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
d910: 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
d920: 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
d930: 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
d940: 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
d950: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
d960: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
d970: 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
d980: 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
d990: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
d9a0: 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
d9b0: 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
d9c0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
d9d0: 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
d9e0: 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
d9f0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
da00: 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
da10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
da20: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
da30: 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
da40: 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
da50: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
da60: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
da70: 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
da80: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
da90: 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
daa0: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
dab0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
dac0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
dad0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
dae0: 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
daf0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
db00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
db10: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
db20: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
db30: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
db40: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
db50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db60: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
db70: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
db80: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
db90: 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
dba0: 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
dbb0: 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
dbc0: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
dbd0: 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20 20 20  int isUnsync,   
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbf0: 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
dc00: 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64 20 6d   from unsynced m
dc10: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
dc20: 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
dc50: 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
dc60: 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e  /.  int isSavepn
dc70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
dc80: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
dc90: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
dca0: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
dcb0: 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 20  pDone           
dcc0: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
dcd0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
dce0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
dcf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
dd00: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd20: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
dd30: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
dd40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
dd70: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
dd80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
dd90: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ddb0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
ddc0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
ddd0: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b   */.  u8 *aData;
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
de00: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
de10: 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
de20: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
de40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
de50: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
de60: 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
de70: 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
de80: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
de90: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
dea0: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
deb0: 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
dec0: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
ded0: 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
dee0: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
def0: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
df00: 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
df10: 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
df20: 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
df30: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
df40: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
df50: 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
df60: 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
df70: 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
df80: 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38  /..  aData = (u8
df90: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
dfa0: 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
dfb0: 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
dfc0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
dfd0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
dfe0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
dff0: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
e000: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
e010: 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
e020: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
e030: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
e040: 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
e050: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
e060: 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
e070: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e080: 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
e090: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
e0a0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
e0b0: 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
e0c0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
e0d0: 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
e0e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e0f0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
e100: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e110: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
e120: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
e130: 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
e140: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
e150: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e160: 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
e170: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
e180: 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
e190: 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
e1a0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
e1b0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
e1c0: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
e1d0: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
e1e0: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
e1f0: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
e200: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
e210: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
e220: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
e230: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
e240: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
e250: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
e260: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
e270: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
e280: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
e290: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
e2a0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
e2b0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
e2c0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
e2d0: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
e2e0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
e2f0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
e300: 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
e310: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e320: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
e330: 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
e340: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
e350: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
e360: 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
e370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e380: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e390: 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
e3a0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
e3b0: 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
e3c0: 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
e3d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
e3e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
e3f0: 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
e400: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
e410: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
e420: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
e430: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e440: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e450: 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
e460: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
e470: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
e480: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e490: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
e4a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e4b0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
e4c0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
e4d0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
e4e0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
e4f0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
e500: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
e510: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
e520: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
e530: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
e540: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
e550: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
e560: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
e570: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
e580: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
e590: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
e5a0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
e5b0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
e5c0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
e5d0: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
e5e0: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
e5f0: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
e600: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
e610: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
e620: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
e630: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
e640: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
e650: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
e660: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
e670: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
e680: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
e690: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
e6a0: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
e6b0: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
e6c0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
e6d0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
e6e0: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
e6f0: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
e700: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
e710: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
e720: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
e730: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
e740: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
e750: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
e760: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
e770: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
e780: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
e790: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
e7a0: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
e7b0: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
e7c0: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
e7d0: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
e7e0: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
e7f0: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
e800: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
e810: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
e820: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
e830: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
e840: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
e850: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
e860: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
e870: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
e880: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
e890: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
e8a0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
e8b0: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
e8c0: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
e8d0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
e8e0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
e8f0: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
e900: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
e910: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
e920: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
e930: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
e940: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
e950: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
e960: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
e970: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
e980: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
e990: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
e9a0: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
e9b0: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
e9c0: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
e9d0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e9e0: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
e9f0: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
ea00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
ea10: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
ea20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
ea30: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
ea40: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
ea50: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
ea60: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
ea70: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
ea80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
ea90: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
eaa0: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
eab0: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
eac0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
ead0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
eae0: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
eaf0: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
eb00: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
eb10: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
eb20: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
eb30: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
eb40: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
eb50: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
eb60: 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
eb70: 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
eb80: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
eb90: 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
eba0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
ebb0: 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
ebc0: 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
ebd0: 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
ebe0: 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
ebf0: 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
ec00: 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
ec10: 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
ec20: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
ec30: 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
ec40: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
ec50: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
ec60: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
ec70: 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
ec80: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
ec90: 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
ecb0: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
ecc0: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
ecd0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
ece0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20  eSize, aData),. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
ed00: 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
ed10: 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
ed20: 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
ed30: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
ed40: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
ed50: 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d  IVE).   && (pPg=
ed60: 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
ed70: 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
ed80: 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f  SYNC)).   && isO
ed90: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
eda0: 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a     && !isUnsync.
edb0: 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
edc0: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
edd0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
ede0: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
edf0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ee00: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
ee10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
ee20: 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
ee30: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
ee40: 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
ee50: 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
ee60: 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
ee70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  }.    sqlite3Bac
ee80: 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
ee90: 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
eea0: 20 61 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65   aData);.  }else
eeb0: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
eec0: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
eed0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
eee0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
eef0: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
ef00: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
ef10: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
ef20: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
ef30: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
ef40: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
ef50: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
ef60: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
ef70: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
ef80: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
ef90: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
efa0: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
efb0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
efc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
efd0: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
efe0: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
eff0: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f000: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f010: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f020: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f030: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f040: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f050: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f060: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f070: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f080: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f090: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f0a0: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f0b0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f0c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f0d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f0e0: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f0f0: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f100: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f110: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f120: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f130: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f140: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f150: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f160: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f170: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f180: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f190: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f1a0: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f1b0: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f1c0: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f1d0: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f1e0: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f1f0: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f200: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f210: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f220: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f230: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f240: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f250: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f260: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f270: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f280: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f2a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f2b0: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f2c0: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f2d0: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f2e0: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f2f0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f300: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f310: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f320: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f330: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f340: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f350: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f360: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f370: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f380: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f390: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f3a0: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f3b0: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f3c0: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f3d0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f3e0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f3f0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f400: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f410: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f420: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f430: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f440: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f450: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f460: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f470: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f480: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
f490: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
f4a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
f4b0: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
f4c0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f4d0: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ter(pPg);.    }.
f4e0: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f4f0: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f500: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f510: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f520: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f530: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f540: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f550: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f560: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f570: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f580: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f590: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f5a0: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f5b0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f5c0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f5d0: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f5e0: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f5f0: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f600: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f610: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f620: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f630: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f640: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f650: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f660: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f670: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f680: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f690: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f6a0: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f6b0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f6c0: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f6d0: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f6e0: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f6f0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f700: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f710: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
f720: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
f730: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
f740: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
f750: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
f760: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
f770: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
f780: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
f790: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f7a0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
f7b0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
f7c0: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
f7d0: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
f7e0: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
f7f0: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
f800: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f810: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
f820: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
f830: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
f840: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
f850: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
f860: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
f870: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
f880: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
f890: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f8a0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
f8b0: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
f8c0: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
f8d0: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
f8e0: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
f8f0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
f900: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
f910: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
f920: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
f930: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
f940: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
f950: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
f960: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
f970: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f980: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
f990: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
f9a0: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
f9b0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
f9c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
f9d0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
f9e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
f9f0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fa00: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fa10: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fa20: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fa30: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fa40: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fa50: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fa60: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fa70: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fa80: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fa90: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
faa0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fab0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fac0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fad0: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
faf0: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fb00: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fb10: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fb20: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fb30: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73  >pgno, 3);.    s
fb40: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
fb50: 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
fb60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
fb70: 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
fb80: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
fb90: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
fba0: 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ST)./*.** This r
fbb0: 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65  outine looks ahe
fbc0: 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ad into the main
fbd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
fbe0: 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  d determines.** 
fbf0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
fc00: 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28  he next record (
fc10: 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20  the record that 
fc20: 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a  begins at file.*
fc30: 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  * offset pPager-
fc40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20  >journalOff) is 
fc50: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61  a well-formed pa
fc60: 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  ge record consis
fc70: 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c  ting.** of a val
fc80: 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  id page number, 
fc90: 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20  pPage->pageSize 
fca0: 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  bytes of content
fcb0: 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79  , followed.** by
fcc0: 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75   a valid checksu
fcd0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  m..**.** The pag
fce0: 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  er never needs t
fcf0: 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f  o know this in o
fd00: 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a  rder to do its j
fd10: 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ob.   This.** ro
fd20: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73  utine is only us
fd30: 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73 73  ed from with ass
fd40: 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
fd50: 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  se() macros..*/.
fd60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
fd70: 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49  NextJournalPageI
fd80: 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70 50  sValid(Pager *pP
fd90: 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  ager){.  Pgno pg
fda0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
fdb0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
fdc0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
fdd0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
fde0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
fdf0: 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ge checksum */. 
fe00: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
fe10: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fe20: 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20 6f  code from read o
fe30: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  perations */.  s
fe40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
fe50: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
fe60: 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d 20  descriptor from 
fe70: 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65 61  which we are rea
fe80: 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  ding */.  u8 *aD
fe90: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
fea0: 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
feb0: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52   page */..  /* R
fec0: 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
fed0: 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ber header */.  
fee0: 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64  fd = pPager->jfd
fef0: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
ff00: 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e  its(fd, pPager->
ff10: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e  journalOff, &pgn
ff20: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
ff30: 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
ff40: 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
ff70: 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  T*/.  if( pgno==
ff80: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
ff90: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
ffa0: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
ffb0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
ffc0: 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28  T*/.  if( pgno>(
ffd0: 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
ffe0: 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  ize ){ return 0;
fff0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10000 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10010 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  T*/..  /* Read t
10020 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  he checksum */. 
10030 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
10040 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  (fd, pPager->jou
10050 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e  rnalOff+pPager->
10060 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
10070 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
10080 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10090 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
100c0 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
100d0 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65 72  the data and ver
100e0 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ify the checksum
100f0 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28 75   */.  aData = (u
10100 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
10110 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pace;.  rc = sql
10120 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
10130 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
10140 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
10150 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20  journalOff+4);. 
10160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10170 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  OK ){ return 0; 
10180 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
101b0 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
101c0 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
101d0 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72 6e  =cksum ){ return
101e0 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
101f0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a     /*NO_TEST*/..
10200 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73 20    /* Reach this 
10210 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68  point only if th
10220 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 20  e page is valid 
10230 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
10240 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10250 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
10260 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
10270 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a  VERAGE_TEST) */.
10280 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
10290 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
102a0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
102b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
102c0 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
102d0 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
102e0 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
102f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10300 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
10310 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
10320 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
10330 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
10340 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
10350 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10360 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
10370 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
10380 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
10390 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
103a0 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
103b0 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
103c0 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
103d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
103e0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
103f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
10400 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
10410 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
10420 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
10430 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
10440 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
10450 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
10460 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
10470 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
10480 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
10490 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
104a0 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
104b0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
104c0 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
104d0 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
104e0 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
104f0 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
10500 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
10510 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
10520 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
10530 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
10540 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
10550 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
10560 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
10570 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
10580 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
10590 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
105a0 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
105b0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
105c0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
105d0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
105e0 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
105f0 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
10600 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
10610 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
10620 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
10630 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10640 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
10650 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
10660 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
10670 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
10680 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
10690 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
106a0 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
106b0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
106c0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
106d0 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
106e0 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
106f0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10700 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
10710 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
10720 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
10730 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
10740 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
10750 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
10760 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
10770 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
10780 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
10790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
107a0 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
107b0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
107c0 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
107d0 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
107e0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
107f0 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
10800 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
10810 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
10820 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
10830 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
10840 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10850 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
10860 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
10870 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
10880 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
10890 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
108a0 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
108b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
108c0 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
108d0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
108e0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
108f0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
10900 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
10910 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
10920 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
10930 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
10940 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
10950 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
10960 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
10970 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
10980 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
10990 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
109a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
109b0 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
109c0 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
109d0 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
109e0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
109f0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
10a00 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
10a10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10a20 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
10a30 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
10a40 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
10a50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
10a60 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
10a70 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10aa0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10ab0 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
10ac0 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
10ad0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
10ae0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
10af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
10b00 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
10b10 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
10b20 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10b30 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
10b40 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
10b50 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
10b60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10b70 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
10b80 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
10b90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
10ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10bb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
10bc0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
10bd0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
10be0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
10bf0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
10c00 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
10c10 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
10c20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
10c30 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
10c40 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
10c50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
10c60 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
10c70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
10c80 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
10c90 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
10ca0 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
10cb0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
10cc0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
10cd0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
10ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
10d00 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
10d10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
10d20 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
10d30 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
10d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10d50 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
10d60 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
10d70 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
10d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d90 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10da0 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20  er_out;..  rc = 
10db0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
10dc0 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
10dd0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
10de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10df0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
10e00 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
10e10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
10e20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
10e30 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
10e40 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
10e50 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
10e60 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
10e70 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a  hname+1;..    /*
10e80 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
10e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ea0 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
10eb0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
10ec0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
10ed0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
10ee0 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
10ef0 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
10f00 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
10f10 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
10f20 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
10f30 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
10f40 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
10f50 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
10f60 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
10f70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10f80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
10f90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
10fa0 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72  }.    zMasterPtr
10fb0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
10fc0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
10fd0 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l];.    rc = sql
10fe0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
10ff0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
11000 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
11010 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
11020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11030 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
11040 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
11050 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
11060 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
11070 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
11080 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
11090 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
110a0 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73        int exists
110b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
110c0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
110d0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
110e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
110f0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
11100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11120 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11130 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
11140 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
11150 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
11160 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
11170 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
11180 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11190 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
111a0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
111b0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
111c0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
111d0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
111e0 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
111f0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
11200 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
11210 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
11220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
11230 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt c;.        in
11240 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
11250 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
11260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11270 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
11280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11290 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
112a0 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
112b0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
112c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
112d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
112e0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
112f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
11300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
11310 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
11320 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
11330 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
11340 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11350 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
11360 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
11370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11380 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
11390 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
113a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
113b0 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
113c0 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
113d0 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
113e0 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
113f0 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
11400 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
11410 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
11420 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11430 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11440 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
11450 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11470 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
11480 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
11490 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
114a0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
114b0 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
114c0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
114d0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
114e0 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
114f0 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
11500 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11510 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
11520 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
11530 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
11540 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11550 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
11560 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
11570 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20  ournal) );.  }. 
11580 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
11590 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
115a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
115b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
115c0 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
115d0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
115e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
115f0 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
11600 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
11610 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
11620 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
11630 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
11640 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
11650 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
11660 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
11670 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
11680 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
11690 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
116a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
116b0 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
116c0 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
116d0 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
116e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
116f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
11700 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
11710 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
11720 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
11730 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
11740 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
11750 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
11760 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
11770 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
11780 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
11790 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
117a0 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
117b0 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
117c0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
117d0 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
117e0 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
117f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
11800 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
11810 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
11820 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
11830 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
11840 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
11850 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
11860 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
11870 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
11880 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
11890 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
118a0 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
118b0 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
118c0 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
118d0 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
118e0 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
118f0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
11900 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
11910 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
11920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
11930 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
11940 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
11950 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
11960 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
11970 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11980 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
11990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
119a0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
119b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
119c0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
119d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
119e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
119f0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
11a00 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  VE && isOpen(pPa
11a10 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
11a20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
11a30 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a   newSize;.    /*
11a40 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
11a50 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
11a60 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
11a70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
11a80 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11a90 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
11aa0 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
11ab0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
11ac0 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
11ad0 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
11ae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
11af0 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
11b00 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
11b10 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
11b20 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
11b30 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11b40 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
11b50 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
11b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11b70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11b80 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
11b90 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
11ba0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11bb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
11bd0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
11be0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
11bf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
11c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c10 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
11c20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
11c30 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
11c40 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
11c50 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
11c60 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
11c70 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
11c80 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
11c90 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
11ca0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
11cb0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
11cc0 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a   be used used .*
11cd0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
11ce0 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
11cf0 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
11d00 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
11d10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
11d20 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
11d30 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
11d40 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
11d50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
11d60 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
11d70 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
11d80 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
11d90 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
11da0 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
11db0 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
11dc0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
11dd0 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
11de0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
11df0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
11e00 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
11e10 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20  up to 512 if.** 
11e20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
11e30 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20  512, or rounded 
11e40 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
11e50 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
11e60 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11e70 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
11e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11e90 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
11ea0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11eb0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
11ec0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
11ed0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11ee0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
11ef0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
11f00 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
11f10 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
11f20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
11f30 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
11f40 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
11f50 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
11f60 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
11f70 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
11f80 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
11f90 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
11fa0 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
11fb0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
11fc0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
11fd0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
11fe0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
11ff0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
12000 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70  ize<512 ){.    p
12010 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
12020 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69  e = 512;.  }.  i
12030 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
12040 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
12050 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
12060 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
12070 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
12080 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
12090 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  ize = MAX_SECTOR
120a0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _SIZE;.  }.}../*
120b0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
120c0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
120d0 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
120e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
120f0 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
12100 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
12110 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
12120 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
12130 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
12140 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
12150 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
12160 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
12170 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
12180 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
12190 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
121a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
121b0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
121c0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
121d0 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
121e0 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
121f0 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
12200 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
12210 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
12220 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
12230 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
12240 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
12250 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
12260 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
12270 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
12280 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
12290 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
122a0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
122b0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
122c0 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
122d0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
122e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
122f0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
12300 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
12310 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
12320 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
12330 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
12340 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
12350 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
12360 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
12370 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
12380 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
12390 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
123a0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
123b0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
123c0 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
123d0 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
123e0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
123f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12400 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
12410 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
12420 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
12430 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
12440 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
12450 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
12460 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
12470 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
12480 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
12490 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
124a0 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
124b0 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
124c0 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
124d0 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
124e0 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
124f0 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
12500 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
12510 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
12520 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
12530 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
12540 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
12550 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
12560 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
12570 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
12580 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
12590 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
125a0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
125b0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
125c0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
125d0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
125e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
125f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
12600 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
12610 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
12620 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
12630 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
12640 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
12650 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
12660 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
12670 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
12680 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
12690 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
126a0 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
126b0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
126c0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
126d0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
126e0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
126f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
12700 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
12710 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
12720 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
12730 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
12740 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
12750 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
12760 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
12780 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
12790 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
127a0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
127b0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
127c0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
127d0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
127e0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
127f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12800 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
12810 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
12820 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
12830 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
12840 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
12850 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
12860 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
12870 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
12880 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
12890 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
128a0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
128b0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
128c0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
128d0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
128e0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
128f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
12900 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
12910 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
12920 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
12930 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
12940 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
12950 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
12960 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
12970 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
12980 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
12990 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
129a0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
129b0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
129c0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
129d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
129e0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
129f0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
12a00 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
12a10 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
12a20 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
12a30 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
12a40 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
12a50 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
12a60 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
12a70 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
12a80 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
12a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
12aa0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
12ab0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
12ac0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
12ad0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
12ae0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
12af0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
12b00 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
12b10 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
12b20 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
12b30 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
12b40 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
12b50 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
12b60 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
12b70 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
12b80 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
12b90 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
12ba0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
12bb0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
12bc0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
12bd0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
12be0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12bf0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
12c00 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
12c10 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
12c20 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
12c30 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
12c40 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
12c50 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
12c60 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
12c70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
12c80 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
12c90 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
12ca0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
12cb0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12cc0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
12cd0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
12ce0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
12cf0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
12d00 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
12d10 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
12d20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
12d30 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
12d40 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
12d50 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
12d60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
12d70 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
12d80 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
12d90 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12da0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
12db0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
12de0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
12df0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
12e00 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
12e10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12e20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
12e30 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
12e40 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
12e50 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
12e60 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
12e70 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
12e80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
12e90 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
12ea0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
12eb0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
12ee0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
12ef0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f10 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12f20 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
12f30 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
12f40 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
12f50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
12f60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12f70 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
12f80 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
12f90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
12fa0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
12fb0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
12fc0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
12fd0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12fe0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
12ff0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
13000 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
13010 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
13020 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
13030 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
13040 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13050 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13060 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13070 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
13080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13090 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
130a0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
130b0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
130c0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
130d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
130e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
130f0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
13100 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
13110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13120 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
13130 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
13140 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
13150 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
13160 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
13170 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
13180 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
13190 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
131a0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
131b0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
131c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
131d0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
131e0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
131f0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
13200 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
13210 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
13220 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
13230 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
13240 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
13250 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
13260 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
13270 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
13280 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
13290 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
132a0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
132b0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
132c0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
132d0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
132e0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
132f0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
13300 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
13310 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
13320 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
13330 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
13340 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
13350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13360 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
13370 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
13380 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
13390 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
133a0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
133b0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
133c0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
133d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
133e0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
133f0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
13400 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
13410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
13420 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
13430 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
13440 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
13450 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
13460 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
13470 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
13480 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
13490 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
134a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
134b0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
134c0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
134d0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
134e0 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79  {.    int isUnsy
134f0 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
13500 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
13510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
13520 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
13530 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
13540 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
13550 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
13560 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13570 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
13580 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
13590 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
135a0 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
135b0 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
135c0 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
135d0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
135e0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
135f0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
13600 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
13620 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
13630 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
13640 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
13650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13660 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
13670 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
13680 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
136a0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
136b0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
136c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
136d0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
136e0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
136f0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
13700 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
13710 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
13720 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
13730 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13740 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
13750 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
13760 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
13770 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
13780 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
13790 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
137a0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
137b0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
137c0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
137d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
137e0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
137f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13800 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13810 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
13820 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
13830 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
13840 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
13850 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13860 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
13870 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
13880 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
13890 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
138a0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
138b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
138c0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
138d0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
138e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
138f0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
13900 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
13910 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
13920 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
13930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13940 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
13950 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
13960 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
13970 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
13980 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
13990 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
139a0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
139b0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
139c0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
139d0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
139e0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
139f0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
13a00 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
13a10 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
13a20 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
13a30 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
13a40 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
13a50 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
13a60 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
13a70 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
13a80 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
13a90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
13aa0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
13ab0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
13ac0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
13ad0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
13ae0 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
13af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
13b00 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13b10 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
13b20 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
13b30 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
13b40 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
13b50 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
13b60 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
13b70 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
13b80 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
13b90 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
13ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
13bb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73  ..    */.    tes
13bc0 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20 26  tcase( nRec==0 &
13bd0 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20 20  & !isHot.       
13be0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
13bf0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
13c00 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
13c10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13c20 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
13c30 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
13c40 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
13c50 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
13c60 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
13c70 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
13c80 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
13c90 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 20  ager).    );.   
13ca0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
13cb0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
13cc0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13cd0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
13ce0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
13cf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13d00 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
13d10 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
13d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13d30 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
13d40 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
13d50 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
13d60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13d70 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
13d80 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
13d90 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
13da0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
13db0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13dc0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
13dd0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
13df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13e00 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13e10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
13e20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
13e30 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
13e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
13e70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
13e80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13e90 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
13ea0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
13eb0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
13ec0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
13ed0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
13ee0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
13ef0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
13f00 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
13f10 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
13f20 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
13f30 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
13f40 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
13f50 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13f60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13f70 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13f80 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13f90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
13fa0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
13fb0 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
13fc0 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
13fd0 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
13fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
14000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
14010 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
14020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14030 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
14040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
14050 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
14060 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
14070 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
14080 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
14090 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  e to rollback, t
140a0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
140b0 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 20   is probably.   
140c0 20 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e 67 20         ** going 
140d0 74 6f 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  to end up being 
140e0 63 6f 72 72 75 70 74 2e 20 20 49 74 20 69 73 20  corrupt.  It is 
140f0 63 6f 72 72 75 70 74 20 74 6f 20 75 73 2c 20 61  corrupt to us, a
14100 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20 20 20 20  nyhow..         
14110 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
14120 6e 65 78 74 20 70 72 6f 63 65 73 73 20 74 6f 20  next process to 
14130 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e 20 66  come along can f
14140 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20 20 20  ix it.....      
14150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
14160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14170 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
14180 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
14190 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
141a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
141b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
141c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
141d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
141e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
141f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14210 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
14220 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
14230 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
14240 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
14250 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
14260 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
14270 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
14280 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
14290 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
142a0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
142b0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
142c0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
142d0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
142e0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
142f0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
14300 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
14310 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
14320 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
14330 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
14340 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14350 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
14360 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
14370 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
14380 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
14390 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
143a0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
143b0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
143c0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
143d0 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
143e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
143f0 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
14400 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
14410 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
14420 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
14430 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
14440 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
14450 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
14460 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
14470 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
14480 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
14490 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
144a0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
144b0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
144c0 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
144d0 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
144e0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
144f0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
14500 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
14510 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
14520 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
14530 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
14540 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
14550 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
14560 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
14570 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
14580 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
14590 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
145a0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
145b0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
145c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
145d0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
145e0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
145f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14600 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
14610 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14620 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
14630 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
14640 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
14650 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
14660 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
14670 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14680 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
14690 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
146a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
146b0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
146c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
146d0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
146e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
146f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
14700 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
14710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
14720 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
14730 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14740 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
14750 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
14760 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
14770 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
14780 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
14790 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
147a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
147b0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
147c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
147d0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
147e0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
147f0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14800 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
14810 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
14820 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
14830 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
14840 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
14850 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
14860 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
14870 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
14880 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
14890 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
148a0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
148b0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
148c0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
148d0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
148e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
148f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
14900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
14910 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
14920 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
14930 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
14940 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
14950 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
14960 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14970 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
14980 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
14990 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
149a0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
149b0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
149c0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
149d0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
149e0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
149f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
14a00 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
14a10 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
14a20 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
14a30 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
14a40 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
14a50 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
14a60 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
14a70 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
14a80 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
14a90 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
14aa0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
14ab0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
14ac0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
14ad0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ae0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
14af0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
14b00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14b10 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
14b20 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
14b30 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
14b40 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
14b50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
14b70 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
14b80 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14b90 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
14ba0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
14bb0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14bc0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
14bd0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
14be0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
14bf0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
14c00 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14c10 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
14c20 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
14c30 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
14c40 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
14c50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14c60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
14c70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
14c80 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
14c90 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14ca0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
14cb0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
14cc0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
14cd0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
14ce0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
14cf0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
14d00 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
14d10 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
14d20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
14d30 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
14d40 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
14d50 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
14d60 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
14d70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
14d80 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
14d90 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
14da0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
14db0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
14dc0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
14dd0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
14de0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
14df0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
14e00 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
14e10 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
14e20 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
14e30 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
14e40 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
14e50 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
14e60 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
14e70 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14e80 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
14e90 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
14ea0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
14eb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
14ec0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
14ed0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
14ee0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
14ef0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
14f00 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
14f10 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
14f20 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
14f30 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
14f40 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
14f50 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
14f60 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
14f70 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
14f80 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
14f90 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
14fa0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
14fb0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
14fc0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
14fd0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
14fe0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
14ff0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
15000 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
15010 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
15020 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
15050 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
15060 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
15070 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
15080 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
15090 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
150a0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
150b0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
150c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
150d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
150e0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
150f0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
15100 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
15110 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
15120 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
15130 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
15140 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
15150 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
15160 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
15170 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
15180 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
15190 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
151a0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
151b0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
151c0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
151d0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
151e0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
151f0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
15200 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15210 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
15220 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
15230 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15240 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
15250 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
15260 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
15270 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
15280 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
15290 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
152a0 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
152b0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
152c0 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
152d0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f  dbOrigSize;..  /
152e0 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
152f0 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
15300 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
15310 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
15320 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
15330 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
15340 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
15350 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
15360 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
15370 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
15380 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
15390 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
153a0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
153b0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
153c0 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
153d0 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
153e0 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
153f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
15400 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
15410 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15420 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
15430 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
15440 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
15450 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
15460 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
15470 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
15480 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
15490 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
154a0 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
154b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
154c0 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
154d0 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
154e0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
154f0 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
15500 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
15510 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
15520 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
15530 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
15540 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
15550 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
15560 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
15570 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
15580 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
15590 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
155a0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
155b0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
155c0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
155d0 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
155e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
155f0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
15600 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
15610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15620 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15630 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
15640 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15650 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15660 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
15670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15680 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
15690 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
156a0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
156b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
156c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
156d0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
156e0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
156f0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
15700 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
15710 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
15720 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
15730 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
15740 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
15750 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
15760 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
15770 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
15780 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
15790 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
157a0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
157b0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
157c0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
157d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
157e0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
157f0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
15800 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
15810 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
15820 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
15830 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15840 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
15850 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
15860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
15870 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
15880 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
15890 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
158a0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
158b0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
158c0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
158d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
158e0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
158f0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
15900 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
15910 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
15920 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
15930 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
15940 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
15950 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
15960 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
15970 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
15980 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
15990 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
159a0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
159b0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
159c0 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52     assert( !(nJR
159d0 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ec==0.         &
159e0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
159f0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
15a00 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61  _SZ(pPager)!=pPa
15a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
15a20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a           && ((sz
15a30 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
15a40 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
15a50 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15a60 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  >0.         && p
15a70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
15a80 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65  ageIsValid(pPage
15a90 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  r)).    );.    i
15aa0 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
15ab0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15ac0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15ad0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
15ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15af0 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
15b00 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
15b10 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15b20 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
15b30 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
15b40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
15b50 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
15b60 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
15b70 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15b80 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
15b90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
15ba0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
15bb0 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30  age(pPager, 1, 0
15bc0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
15bd0 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29  alOff, 1, pDone)
15be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15bf0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15c00 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
15c10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15c20 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
15c30 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b  urnalOff==szJ );
15c40 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
15c50 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
15c60 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
15c70 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
15c80 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
15c90 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
15ca0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
15cb0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
15cc0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
15cd0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
15ce0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
15cf0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
15d00 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
15d10 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
15d20 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
15d30 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
15d40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15d50 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
15d60 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
15d70 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
15d80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
15d90 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
15da0 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
15db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
15dc0 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
15dd0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
15de0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
15df0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
15e00 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
15e10 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
15e20 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
15e30 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66 73  ger, 0, 0, &offs
15e40 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  et, 1, pDone);. 
15e50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15e70 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
15e80 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
15e90 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
15ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15eb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15ec0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
15ed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15ee0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ef0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
15f00 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
15f10 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
15f20 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
15f30 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15f40 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
15f50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
15f60 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
15f70 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
15f80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
15f90 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
15fa0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
15fb0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
15fc0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
15fd0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
15fe0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
15ff0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
16000 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
16010 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
16020 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
16030 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16040 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
16050 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
16060 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
16070 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
16080 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
16090 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
160a0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
160b0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
160c0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
160d0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
160e0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
160f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
16100 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
16110 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
16120 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16130 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
16140 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
16150 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
16160 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
16170 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
16180 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
16190 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
161a0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
161b0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
161c0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
161d0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
161e0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
161f0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
16200 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
16210 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
16220 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
16230 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
16240 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
16250 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
16260 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
16270 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
16280 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
16290 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
162a0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
162b0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
162c0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
162d0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
162e0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
162f0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
16300 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
16310 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
16320 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
16330 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
16350 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
16360 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
16370 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
16380 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
16390 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
163a0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
163b0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
163c0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
163d0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
163e0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
163f0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
16400 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16410 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
16420 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
16430 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
16440 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
16450 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
16460 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
16470 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
16480 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
16490 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
164a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
164b0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
164c0 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
164d0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
164e0 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
164f0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
16500 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a  nt bFullFsync){.
16510 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
16520 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
16530 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
16540 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
16550 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
16560 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
16570 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
16580 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :0;.  pPager->sy
16590 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
165a0 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
165b0 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
165c0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
165d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
165e0 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
165f0 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
16600 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
16610 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
16620 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
16630 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
16640 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
16650 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
16660 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
16670 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
16680 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
16690 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
166a0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
166b0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
166c0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
166d0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
166e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
166f0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
16700 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
16710 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
16720 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
16730 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
16740 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
16750 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
16760 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
16770 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
16780 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
16790 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
167a0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
167b0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
167c0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
167d0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
167e0 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
167f0 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
16800 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
16810 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
16820 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
16830 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
16840 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
16850 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16860 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
16870 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
16880 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16890 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
168a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
168b0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
168c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
168d0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
168e0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
168f0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
16900 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
16910 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
16920 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16930 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
16940 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
16950 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
16960 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
16970 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
16980 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
169b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
169c0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
169d0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
169e0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
169f0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
16a00 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
16a10 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
16a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16a30 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16a40 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
16a50 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16a60 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
16a70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
16a80 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
16a90 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
16aa0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
16ab0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
16ac0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
16ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
16ae0 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
16af0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16b00 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
16b10 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
16b20 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
16b30 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
16b40 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
16b50 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
16b60 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
16b70 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
16b80 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
16b90 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
16ba0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
16bb0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
16bc0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
16bd0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
16be0 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
16bf0 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
16c00 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
16c10 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
16c20 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
16c30 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
16c40 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
16c50 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
16c60 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
16c70 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
16c80 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
16c90 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
16ca0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
16cb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
16cc0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
16ce0 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
16cf0 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d30 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
16d40 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
16d50 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
16d60 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
16d70 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
16d80 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
16d90 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16da0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
16db0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
16dc0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
16dd0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
16de0 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
16df0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
16e00 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
16e10 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
16e20 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
16e30 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
16e40 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
16e50 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
16e60 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
16e70 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
16e80 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
16e90 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
16ea0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
16eb0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
16ec0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
16ef0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
16f00 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
16f10 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
16f20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
16f30 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
16f40 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
16f50 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
16f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
16f70 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
16f80 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
16f90 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d  /.){  .  pPager-
16fa0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
16fb0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
16fc0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
16fd0 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
16fe0 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a  andlerArg;.}../*
16ff0 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
17000 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
17010 69 73 20 70 61 67 65 72 2e 20 49 66 20 6e 6f 74  is pager. If not
17020 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
17030 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
17040 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
17050 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
17060 20 69 6e 20 63 61 63 68 65 20 69 73 20 6d 6f 64   in cache is mod
17070 69 66 69 65 64 20 28 72 65 73 74 6f 72 65 64 29  ified (restored)
17080 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61  .** as part of a
17090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
170a0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
170b0 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  ck. The callback
170c0 20 67 69 76 65 73 20 0a 2a 2a 20 68 69 67 68 65   gives .** highe
170d0 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20 61 6e 20  r-level code an 
170e0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
170f0 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
17100 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20   section to .** 
17110 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
17120 65 73 74 6f 72 65 64 20 70 61 67 65 20 64 61 74  estored page dat
17130 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
17140 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
17150 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
17160 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74  , void (*xReinit
17170 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70  )(DbPage*)){.  p
17180 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
17190 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
171a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
171b0 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
171c0 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
171d0 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
171e0 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
171f0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
17200 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17210 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
17220 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
17230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
17240 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
17250 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
17260 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
17270 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
17280 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
17290 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
172a0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
172b0 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
172c0 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
172d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
172e0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
172f0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
17300 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
17310 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
17320 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
17330 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
17340 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
17350 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
17360 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
17370 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
17380 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
17390 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
173a0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
173b0 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
173c0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
173d0 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
173e0 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
173f0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
17400 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
17410 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17420 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
17430 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
17440 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
17450 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
17460 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
17470 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
17480 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
17490 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
174a0 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
174b0 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
174c0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
174d0 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
174e0 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
174f0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
17500 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
17510 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
17520 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17530 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
17540 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
17550 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
17560 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
17570 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
17580 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17590 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
175a0 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
175b0 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
175c0 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
175d0 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
175e0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
175f0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
17600 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
17610 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
17620 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
17630 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
17640 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
17650 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
17660 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
17670 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
17680 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
17690 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
176a0 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
176b0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
176c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
176d0 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
176e0 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
176f0 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74  PageSize){.  int
17700 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17710 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d  rCode;.  if( rc=
17720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17730 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
17740 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
17750 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
17760 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
17770 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
17780 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
17790 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
177a0 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26   if( pageSize &&
177b0 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
177c0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
177d0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65    && (pPager->me
177e0 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
177f0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
17800 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
17810 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
17820 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
17830 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
17840 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
17850 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
17860 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
17870 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
17880 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
178a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
178b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
178c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
178d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
178e0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
178f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
17900 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
17910 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
17920 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
17930 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
17940 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
17950 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
17960 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
17970 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
17980 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53     }.    *pPageS
17990 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65  ize = (u16)pPage
179a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
179b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
179c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
179d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
179e0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
179f0 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
17a00 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
17a10 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
17a20 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
17a30 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
17a40 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
17a50 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
17a60 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
17a70 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
17a80 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
17a90 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
17aa0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
17ab0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
17ac0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
17ad0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
17ae0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
17af0 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
17b00 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
17b10 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
17b20 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
17b30 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
17b40 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
17b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
17b60 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
17b70 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
17b80 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
17b90 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
17ba0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
17bb0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
17bc0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
17bd0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
17be0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
17bf0 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
17c00 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
17c10 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
17c20 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
17c30 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
17c40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17c50 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
17c60 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
17c70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
17c80 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17ca0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
17cb0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17cc0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
17cd0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
17ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
17cf0 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
17d00 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
17d10 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
17d20 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
17d30 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
17d40 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
17d50 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
17d60 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
17d70 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
17d80 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
17d90 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
17da0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
17db0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
17dc0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
17dd0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
17de0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
17df0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
17e00 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
17e10 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
17e20 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
17e30 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
17e40 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
17e50 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
17e60 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17e70 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
17e80 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
17e90 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
17ea0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17eb0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
17ec0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
17ed0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
17ee0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
17ef0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
17f00 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
17f10 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
17f20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
17f30 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
17f40 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
17f50 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
17f60 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
17f70 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
17f80 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
17f90 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
17fa0 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
17fb0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17fc0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
17fd0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17fe0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
17ff0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
18000 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
18010 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
18020 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
18030 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
18040 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
18050 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
18060 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
18070 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
18080 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
18090 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
180a0 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
180b0 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
180c0 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
180d0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
180e0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
180f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
18100 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
18110 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
18120 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
18130 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
18140 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
18150 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
18160 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
18170 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
18180 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
18190 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
181a0 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
181b0 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
181c0 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
181d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
181e0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
181f0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
18200 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
18210 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
18220 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
18230 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
18240 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
18250 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
18260 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
18270 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
18280 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
18290 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
182a0 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
182b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
182c0 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
182d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
182e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
182f0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18300 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ile );.  if( isO
18310 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18320 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
18330 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
18340 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
18350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18360 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
18370 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
18380 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18390 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
183a0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
183b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
183c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
183d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
183e0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
183f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18410 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  le associated .*
18420 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e  * with pPager. N
18430 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  ormally, this is
18440 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28   calculated as (
18450 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c  <db file size>/<
18460 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20  page-size>)..** 
18470 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
18480 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
18490 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
184a0 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
184b0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
184c0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
184d0 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   page file..**.*
184e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
184f0 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
18500 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
18510 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
18520 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  hen the.** error
18530 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
18540 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18550 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75  d *pnPage left u
18560 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a  nchanged. Or,.**
18570 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73   if the file sys
18580 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75  tem has to be qu
18590 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69  eried for the si
185a0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  ze of the file a
185b0 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20  nd.** the query 
185c0 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20  attempt returns 
185d0 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65  an IO error, the
185e0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
185f0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
18600 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
18610 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
18620 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
18630 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
18640 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
18650 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18660 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e  urned.** and *pn
18670 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74  Page is set to t
18680 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18690 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
186a0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
186b0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
186c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
186d0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
186e0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
186f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
18700 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
18710 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
18720 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
18730 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
18740 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
18750 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
18760 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ode. */.  if( pP
18770 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
18780 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
18790 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
187a0 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
187b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
187c0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
187d0 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20  . Store this in 
187e0 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  nPage. */.  if( 
187f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
18800 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  lid ){.    nPage
18810 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
18820 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
18830 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18840 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
18850 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
18860 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20  ileSize() */.   
18870 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
18890 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72   size in bytes r
188a0 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
188b0 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20  eSize() */..    
188c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
188d0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
188e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
188f0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
18900 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20  (pPager->fd) && 
18910 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
18920 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
18930 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20  ager->fd, &n))) 
18940 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
18950 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
18960 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18970 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
18980 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
18990 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
189a0 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
189b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189c0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
189d0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
189e0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
189f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
18a00 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18a10 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18a20 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
18a30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18a40 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
18a50 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
18a60 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31  >dbSizeValid = 1
18a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18a80 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
18a90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18aa0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
18ab0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
18ac0 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65   .  ** configure
18ad0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
18ae0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
18af0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
18b00 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
18b10 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
18b20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
18b30 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
18b40 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
18b50 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
18b60 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
18b70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
18b80 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64  put variable and
18b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18ba0 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67  K */.  if( pnPag
18bb0 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65  e ){.    *pnPage
18bc0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
18bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18be0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
18bf0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
18c00 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
18c10 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
18c20 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
18c30 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
18c40 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
18c50 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
18c60 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
18c70 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
18c80 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
18c90 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
18ca0 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
18cb0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
18cc0 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
18cd0 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
18ce0 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
18cf0 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
18d00 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
18d10 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
18d20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
18d30 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
18d40 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
18d50 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
18d60 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
18d70 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
18d80 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
18d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18da0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
18db0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
18dc0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
18dd0 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
18de0 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
18df0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
18e00 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
18e10 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
18e20 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
18e30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18e50 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
18e60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
18e70 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
18e80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18eb0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
18ec0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
18ed0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
18ee0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
18ef0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
18f00 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
18f10 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
18f20 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18f30 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
18f40 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
18f50 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
18f60 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
18f70 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
18f80 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
18f90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
18fa0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
18fb0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
18fc0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
18fd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18fe0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
18ff0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
19000 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  lid==0 );..  /* 
19010 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
19020 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
19030 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
19040 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
19050 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
19060 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
19070 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
19080 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
19090 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
190a0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
190b0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
190c0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
190d0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
190e0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
190f0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
19100 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
19110 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  e>=locktype).   
19120 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
19130 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19140 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
19150 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
19160 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
19170 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
19180 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74  ESERVED && lockt
19190 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55  ype==PAGER_EXCLU
191a0 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66  SIVE).  );..  if
191b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
191c0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
191d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
191e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
191f0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
19200 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
19210 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
19220 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
19230 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
19240 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
19250 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
19260 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
19270 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19290 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
192a0 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
192b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
192c0 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
192d0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
192e0 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
192f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19300 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
19310 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19320 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
19330 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
19340 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
19350 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
19360 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
19370 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
19380 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
19390 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
193a0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
193b0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
193c0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
193d0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
193e0 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
193f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
19400 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
19410 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
19420 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
19430 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19440 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
19450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19460 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
19470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
19480 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
19490 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
194a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
194b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
194c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
194d0 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  age;.}../*.** Sh
194e0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
194f0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
19500 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
19510 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
19520 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
19530 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
19540 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
19550 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
19560 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
19570 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
19580 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
19590 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
195a0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
195b0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
195c0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
195d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
195e0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
195f0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
19600 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
19610 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19620 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
19630 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
19640 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
19650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
19660 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
19670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19680 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
19690 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
196a0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
196b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
196c0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
196d0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
196e0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
196f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
19700 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
19710 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
19720 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
19730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19740 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
19750 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73   *pPager){.  dis
19760 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
19770 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
19780 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
19790 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67  Malloc();.  pPag
197a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
197b0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
197c0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
197d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
197e0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
197f0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
19800 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
19810 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
19820 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
19830 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
19840 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
19850 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
19860 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
19870 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
19880 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
19890 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
198a0 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
198b0 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
198c0 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
198d0 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
198e0 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
198f0 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
19900 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
19910 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
19920 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
19930 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
19940 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
19950 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
19960 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
19970 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
19980 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19990 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  alHdr = -1;.    
199a0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
199b0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
199c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
199d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
199e0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
199f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
19a00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
19a10 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
19a20 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
19a30 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
19a40 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
19a50 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
19a60 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
19a70 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
19a80 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
19a90 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
19aa0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
19ab0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 61  ->pPCache);..  a
19ac0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
19ad0 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
19ae0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
19af0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
19b00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
19b10 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
19b20 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
19b30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19b40 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
19b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19b60 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
19b70 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
19b80 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
19b90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
19ba0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
19bb0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
19bc0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19bd0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
19be0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
19bf0 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
19c00 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
19c10 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
19c20 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
19c30 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
19c40 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
19c50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
19c60 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
19c70 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
19c80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
19c90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
19ca0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
19cb0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
19cc0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
19cd0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
19ce0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
19cf0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
19d00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
19d10 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
19d20 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
19d30 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
19d40 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
19d50 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
19d60 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
19d70 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74   not set, then t
19d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19d90 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  a.** no-op. Othe
19da0 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
19db0 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
19dc0 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
19dd0 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68  l-mode.** and th
19de0 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
19df0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
19e00 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
19e10 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
19e20 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
19e30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
19e40 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
19e50 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
19e60 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
19e70 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
19e80 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
19e90 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
19ea0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
19eb0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
19ec0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
19ed0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
19ee0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
19ef0 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
19f00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
19f10 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
19f20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
19f30 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
19f40 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
19f50 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
19f60 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
19f70 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
19f80 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
19f90 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
19fa0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
19fb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
19fc0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
19fd0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
19fe0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
19ff0 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
1a000 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1a010 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
1a020 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
1a030 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
1a040 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
1a050 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
1a060 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
1a070 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
1a080 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
1a090 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
1a0a0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
1a0b0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
1a0c0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
1a0d0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1a0e0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
1a0f0 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
1a100 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
1a110 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
1a120 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
1a130 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
1a140 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50     }.**.** The P
1a150 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1a160 61 67 20 69 73 20 6e 65 76 65 72 20 62 65 20 73  ag is never be s
1a170 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  et for temporary
1a180 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a   files, or any.*
1a190 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67  * file operating
1a1a0 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1a1b0 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73   (Pager.noSync s
1a1c0 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e  et to non-zero).
1a1d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1a1e0 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
1a1f0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
1a200 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
1a210 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
1a220 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
1a230 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
1a240 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
1a250 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
1a260 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
1a270 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
1a280 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1a290 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1a2a0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
1a2b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
1a2c0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
1a2d0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
1a2e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1a2f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1a300 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a310 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1a320 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1a330 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1a340 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
1a350 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a380 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63   code */.      c
1a390 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
1a3a0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a3b0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a3c0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1a3d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1a3e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1a3f0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1a400 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1a410 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
1a420 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61          /* Varia
1a430 62 6c 65 20 69 4e 52 65 63 4f 66 66 73 65 74 20  ble iNRecOffset 
1a440 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
1a450 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
1a460 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  nal file.       
1a470 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52 65 63 20   ** of the nRec 
1a480 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
1a490 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
1a4a0 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
1a4b0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  r..        ** Th
1a4c0 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65  is field will be
1a4d0 20 75 70 64 61 74 65 64 20 66 6f 6c 6c 6f 77 69   updated followi
1a4e0 6e 67 20 74 68 65 20 78 53 79 6e 63 28 29 20 6f  ng the xSync() o
1a4f0 70 65 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  peration.       
1a500 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
1a510 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1a520 20 20 20 20 69 36 34 20 69 4e 52 65 63 4f 66 66      i64 iNRecOff
1a530 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
1a540 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
1a550 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1a560 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1a570 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
1a580 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
1a590 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
1a5a0 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
1a5b0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1a5c0 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
1a5d0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
1a5e0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
1a5f0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
1a600 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1a610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a620 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
1a630 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
1a640 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
1a650 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
1a660 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
1a670 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
1a680 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
1a690 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
1a6a0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
1a6b0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
1a6c0 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
1a6d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1a6e0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
1a6f0 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f  tions transactio
1a700 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
1a710 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
1a720 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
1a730 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
1a740 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
1a750 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
1a760 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
1a770 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
1a780 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
1a790 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
1a7a0 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
1a7b0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
1a7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
1a7d0 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
1a7e0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
1a7f0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
1a800 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
1a810 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
1a820 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
1a830 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
1a840 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
1a850 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
1a860 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
1a870 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
1a880 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
1a890 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
1a8a0 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
1a8b0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
1a8c0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1a8d0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
1a8e0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
1a8f0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
1a900 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
1a910 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
1a920 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
1a930 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
1a940 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
1a950 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
1a960 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
1a970 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
1a980 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
1a990 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
1a9a0 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
1a9b0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
1a9c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1a9d0 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
1a9e0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
1a9f0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
1aa00 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
1aa10 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
1aa20 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
1aa30 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
1aa40 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
1aa50 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
1aa60 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
1aa70 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
1aa80 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
1aa90 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
1aaa0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
1aab0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
1aac0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
1aad0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
1aae0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
1aaf0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
1ab00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1ab10 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
1ab20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ab30 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1ab40 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
1ab50 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
1ab60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ab70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
1ab80 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
1ab90 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1aba0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
1abb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1abc0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
1abd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1abe0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1abf0 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
1ac00 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
1ac10 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
1ac20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1ac30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1ac40 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1ac50 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1ac60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ac70 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1ac80 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1ac90 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1aca0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1acb0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
1acc0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
1acd0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
1ace0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
1acf0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
1ad00 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
1ad10 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
1ad20 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
1ad30 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
1ad40 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
1ad50 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
1ad60 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
1ad70 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
1ad80 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
1ad90 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
1ada0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
1adb0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
1adc0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
1add0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
1ade0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1adf0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
1ae00 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1ae10 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
1ae20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
1ae30 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
1ae40 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1ae50 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
1ae60 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
1ae70 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
1ae80 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
1ae90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
1aea0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
1aeb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
1aec0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
1aed0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
1aee0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1aef0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1af00 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
1af10 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1af20 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
1af30 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1af40 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
1af50 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1af60 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
1af70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1af80 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1af90 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
1afa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1afb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1afc0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1afd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1afe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
1b010 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
1b020 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
1b030 65 72 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c  er, iNRecOffset,
1b040 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
1b050 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1b060 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4e 52 65  Pager->jfd, iNRe
1b070 63 4f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d  cOffset, pPager-
1b080 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
1b090 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b0a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b0c0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1b0d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1b0e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
1b0f0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
1b100 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
1b110 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b120 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
1b130 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1b140 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b160 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1b170 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1b180 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
1b190 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
1b1a0 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
1b1b0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
1b1c0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
1b1d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1b1e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b1f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1b200 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1b210 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  ..    /* The jou
1b220 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
1b230 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  st successfully 
1b240 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65  synced. Set Page
1b250 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
1b260 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63  ** to zero and c
1b270 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
1b280 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
1b290 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20   all pagess..   
1b2a0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1b2b0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1b2c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b2d0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
1b2e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
1b2f0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
1b300 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1b310 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b330 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
1b340 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1b350 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1b360 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
1b370 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
1b380 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
1b390 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
1b3a0 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
1b3b0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
1b3c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
1b3d0 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
1b3e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b3f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
1b400 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
1b410 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
1b420 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
1b430 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
1b440 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
1b450 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
1b460 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
1b470 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
1b480 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
1b490 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
1b4a0 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
1b4b0 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
1b4c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b4d0 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
1b4e0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
1b4f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1b500 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
1b510 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
1b520 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
1b530 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
1b540 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
1b550 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
1b560 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
1b570 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1b580 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
1b590 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
1b5a0 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
1b5b0 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
1b5c0 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
1b5d0 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
1b5e0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1b5f0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
1b600 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
1b610 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
1b620 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
1b630 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
1b640 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
1b650 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
1b660 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
1b670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b680 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
1b690 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
1b6a0 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
1b6b0 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
1b6c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b6d0 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
1b6e0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
1b6f0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
1b700 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1b710 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
1b720 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1b730 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
1b740 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
1b750 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
1b760 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
1b770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b780 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
1b790 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
1b7a0 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
1b7b0 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
1b7c0 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
1b7d0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
1b7e0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
1b7f0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1b800 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
1b810 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
1b820 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
1b830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b840 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
1b850 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1b860 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1b870 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1b880 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
1b890 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
1b8a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1b8b0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
1b8c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
1b8d0 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
1b8e0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
1b8f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1b900 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1b910 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1b920 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
1b930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1b960 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1b970 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b9a0 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  */..  if( pList=
1b9b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b9c0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
1b9d0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
1b9e0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
1b9f0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
1ba00 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
1ba10 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
1ba20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
1ba30 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1ba40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
1ba50 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
1ba60 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
1ba70 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20  owing.  ** call 
1ba80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
1ba90 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
1baa0 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
1bab0 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
1bac0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
1bad0 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
1bae0 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
1baf0 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
1bb00 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
1bb10 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
1bb20 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
1bb30 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
1bb40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
1bb50 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
1bb60 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
1bb70 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
1bb80 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
1bb90 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
1bba0 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
1bbb0 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
1bbc0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
1bbd0 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
1bbe0 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
1bbf0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
1bc00 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
1bc10 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
1bc20 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
1bc30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1bc40 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
1bc50 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
1bc60 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1bc70 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
1bc80 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
1bc90 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1bca0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1bcb0 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
1bcc0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
1bcd0 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
1bce0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1bcf0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
1bd00 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
1bd10 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
1bd20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
1bd30 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
1bd40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bd50 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1bd60 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63  RESERVED );.  rc
1bd70 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1bd80 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1bd90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a  CLUSIVE_LOCK);..
1bda0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1bdb0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
1bdc0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1bdd0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1bde0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
1bdf0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
1be00 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
1be10 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
1be20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
1be30 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
1be40 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1be50 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1be60 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
1be70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
1be80 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1be90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bea0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1beb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1bec0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1bed0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
1bee0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
1bef0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
1bf00 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1bf10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bf20 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
1bf30 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
1bf40 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
1bf50 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
1bf60 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
1bf70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
1bf80 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1bf90 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
1bfa0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
1bfb0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
1bfc0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1bfd0 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
1bfe0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
1bff0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
1c000 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
1c010 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
1c020 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
1c030 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
1c040 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
1c050 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c060 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
1c070 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
1c080 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
1c090 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1c0a0 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
1c0b0 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
1c0c0 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
1c0d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c0e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
1c0f0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
1c100 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
1c110 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
1c120 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c130 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1c140 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1c150 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1c160 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1c170 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
1c180 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1c190 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
1c1a0 67 6e 6f 2c 20 36 29 3b 20 2f 2a 20 44 61 74 61  gno, 6); /* Data
1c1b0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20   to write */..  
1c1c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
1c1d0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
1c1e0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1c1f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c200 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
1c210 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c220 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
1c230 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
1c240 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
1c250 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
1c260 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
1c270 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
1c280 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
1c290 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c2a0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
1c2b0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
1c2c0 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
1c2d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1c2e0 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
1c2f0 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
1c300 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
1c310 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1c320 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1c330 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1c340 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1c350 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c360 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1c370 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1c380 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1c390 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1c3a0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c3b0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
1c3c0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
1c3d0 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
1c3e0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
1c3f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
1c400 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
1c410 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1c420 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1c430 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 20 2a 29  up, pgno, (u8 *)
1c440 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
1c450 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
1c460 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
1c470 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1c490 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c4a0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1c4b0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
1c4c0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1c4d0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
1c4e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1c4f0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1c500 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1c510 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
1c520 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1c530 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
1c540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c550 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
1c560 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1c570 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c580 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
1c590 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1c5a0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1c5b0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
1c5c0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1c5d0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
1c5e0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
1c5f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
1c600 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c610 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1c620 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
1c630 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1c640 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
1c650 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
1c660 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
1c670 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
1c680 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
1c690 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
1c6a0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
1c6b0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
1c6c0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
1c6d0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1c6e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1c6f0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
1c700 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1c710 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
1c720 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
1c730 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
1c740 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
1c750 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c760 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1c770 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c780 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c790 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
1c7a0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
1c7b0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
1c7c0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1c7d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
1c7e0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
1c7f0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
1c800 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
1c810 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
1c820 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
1c830 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
1c840 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
1c850 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
1c860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c870 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1c880 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c890 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70  ager;.  if( isOp
1c8a0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
1c8b0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1c8c0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
1c8d0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
1c8e0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
1c8f0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
1c900 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61  geSize);.    cha
1c910 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c920 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c930 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c940 0a 20 20 0a 20 20 20 20 50 41 47 45 52 54 52 41  .  .    PAGERTRA
1c950 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
1c960 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c970 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c980 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1c990 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61   .    assert( pa
1c9a0 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1c9b0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
1c9c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1c9d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   );.    rc = wri
1c9e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1c9f0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
1ca00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1ca10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ca30 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1ca40 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
1ca50 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1ca60 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
1ca70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ca80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ca90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
1caa0 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
1cab0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
1cac0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
1cad0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
1cae0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1caf0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1cb00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1cb10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cb20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cb30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1cb40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cb50 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
1cb60 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
1cb70 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
1cb80 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
1cb90 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
1cba0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1cbb0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
1cbc0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
1cbd0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
1cbe0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
1cbf0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
1cc00 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
1cc10 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
1cc20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cc30 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
1cc40 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
1cc50 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
1cc60 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
1cc70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1cc80 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
1cc90 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
1cca0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1ccb0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
1ccc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1ccd0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
1cce0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
1ccf0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1cd00 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
1cd10 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
1cd20 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
1cd30 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1cd40 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
1cd50 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
1cd60 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
1cd70 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1cd80 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
1cd90 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
1cda0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1cdb0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
1cdc0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
1cdd0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
1cde0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1cdf0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1ce00 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
1ce10 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
1ce20 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
1ce30 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1ce40 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
1ce50 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
1ce60 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
1ce70 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
1ce80 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1ce90 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
1cea0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1ceb0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
1cec0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1ced0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
1cee0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1cef0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
1cf00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1cf10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1cf20 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
1cf30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cf40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1cf50 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
1cf60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1cf70 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1cf80 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
1cf90 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1cfa0 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1cfb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1cfc0 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1cfd0 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e  it.  ** is journ
1cfe0 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20  alling a set of 
1cff0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61  two or more data
1d000 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20  base pages that 
1d010 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20  are stored.  ** 
1d020 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b  on the same disk
1d030 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67   sector. Syncing
1d040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1d050 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c  not allowed whil
1d060 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68  e.  ** this is h
1d070 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1d080 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1d090 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1d0a0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20  such a.  ** set 
1d0b0 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
1d0c0 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
1d0d0 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
1d0e0 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
1d0f0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69  ion.  ** is tryi
1d100 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
1d110 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1d120 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
1d130 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
1d140 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
1d150 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1d160 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
1d170 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
1d180 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20   will.  ** just 
1d190 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1d1a0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d1b0 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1d1c0 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
1d1d0 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a  reusing pPg..  *
1d1e0 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79  *.  ** Similarly
1d1f0 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68  , if the pager h
1d200 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
1d210 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
1d220 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  te, do not.  ** 
1d230 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1d240 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1d250 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
1d260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1d270 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
1d280 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d290 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d2a0 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20  EED_SYNC) ){.   
1d2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d2c0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e  K;.  }..  /* Syn
1d2d0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1d2e0 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
1d2f0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
1d300 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d310 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  YNC ){.    rc = 
1d320 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1d330 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1d340 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1d350 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1d360 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65  & .      !(pPage
1d370 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1d380 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1d390 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
1d3a0 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
1d3b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1d3c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
1d3d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1d3e0 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b  E_APPEND).    ){
1d3f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1d400 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Rec = 0;.      r
1d410 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1d420 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1d430 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1d440 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1d450 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
1d460 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1d470 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1d480 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1d490 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
1d4a0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
1d4b0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
1d4c0 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73  urnal..  ** This
1d4d0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1d4e0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
1d4f0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
1d500 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
1d510 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
1d520 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
1d530 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1d540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69  .  **.  ** Consi
1d550 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1d560 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
1d570 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents:.  **.  ** 
1d580 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
1d590 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
1d5a0 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  X>.  **     <mod
1d5b0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  ify page X>.  **
1d5c0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
1d5d0 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  p;.  **       <s
1d5e0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
1d5f0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
1d600 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
1d610 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
1d620 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
1d630 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a   TO sp;.  **.  *
1d640 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
1d650 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
1d660 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
1d670 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
1d680 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20  ritten.  ** out 
1d690 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d6a0 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
1d6b0 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
1d6c0 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
1d6d0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
1d6e0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
1d6f0 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
1d700 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
1d710 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74  ll read.  ** dat
1d720 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1d730 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
1d740 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
1d750 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
1d760 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
1d770 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1d780 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
1d790 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
1d7a0 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61  OINT sp".  ** wa
1d7b0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
1d7c0 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  .  ** The soluti
1d7d0 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1d7e0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1d7f0 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1d800 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
1d810 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
1d820 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1d830 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
1d840 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a  that it will.  *
1d850 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
1d860 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
1d870 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
1d880 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
1d890 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a  .  ** executed..
1d8a0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1d8b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
1d8c0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1d8d0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
1d8e0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
1d8f0 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
1d900 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
1d910 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1d920 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1d930 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
1d940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d950 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1d960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d970 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1d980 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d990 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1d9a0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Pg);.  }..  /* M
1d9b0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1d9c0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
1d9d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d9e0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
1d9f0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
1da00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1da10 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1da20 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
1da30 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1da40 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
1da50 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1da60 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1da70 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1da80 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
1da90 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
1daa0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
1dab0 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
1dac0 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
1dad0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
1dae0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
1daf0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
1db00 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1db10 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
1db20 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1db30 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
1db40 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1db50 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
1db60 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
1db70 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
1db80 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
1db90 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
1dba0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
1dbb0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
1dbc0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
1dbd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
1dbe0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
1dbf0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1dc00 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
1dc10 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
1dc20 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
1dc30 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
1dc40 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
1dc50 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
1dc60 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
1dc70 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
1dc80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
1dc90 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
1dca0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1dcb0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
1dcc0 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
1dcd0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
1dce0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
1dcf0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
1dd00 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
1dd10 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
1dd20 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
1dd30 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
1dd40 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
1dd50 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
1dd60 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
1dd70 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
1dd80 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
1dd90 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
1dda0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
1ddb0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
1ddc0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
1ddd0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
1dde0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
1ddf0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
1de00 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
1de10 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
1de20 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
1de30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
1de40 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
1de50 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
1de60 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
1de70 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
1de80 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
1de90 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
1dea0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
1deb0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
1dec0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1ded0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
1dee0 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
1def0 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
1df00 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
1df10 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
1df20 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1df30 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
1df40 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
1df50 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
1df60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1df70 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
1df80 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1df90 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
1dfa0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
1dfb0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
1dfc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
1dfd0 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
1dfe0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
1dff0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
1e000 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1e010 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
1e020 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
1e030 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
1e040 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
1e050 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e060 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
1e070 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
1e080 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
1e090 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
1e0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e0b0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
1e0c0 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
1e0d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e0e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
1e0f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e100 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1e110 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
1e120 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
1e130 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
1e140 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
1e150 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1e160 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e180 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
1e190 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
1e1a0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
1e1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e1c0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1e1d0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
1e1e0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
1e1f0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
1e200 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
1e210 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e220 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
1e230 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
1e240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e250 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1e260 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e270 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
1e280 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e290 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
1e2a0 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
1e2b0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
1e2c0 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
1e2d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e2e0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1e2f0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
1e300 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
1e310 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e320 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
1e330 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
1e340 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
1e350 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
1e360 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e370 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1e380 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
1e390 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1e3a0 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
1e3b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e3c0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
1e3d0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1e3e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1e3f0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
1e400 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
1e410 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e420 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
1e430 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
1e440 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
1e450 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
1e460 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e470 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
1e480 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
1e490 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
1e4a0 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
1e4b0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
1e4c0 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
1e4d0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1e4e0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
1e4f0 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66  /.  u16 szPageDf
1e500 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
1e510 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
1e520 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
1e530 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
1e540 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
1e550 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
1e560 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
1e570 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
1e580 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
1e590 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
1e5a0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
1e5b0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
1e5c0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
1e5d0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
1e5e0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
1e5f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
1e600 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1e610 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
1e620 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
1e630 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
1e640 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
1e650 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
1e660 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
1e670 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
1e680 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
1e690 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
1e6a0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
1e6b0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
1e6c0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
1e6d0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
1e6e0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
1e6f0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
1e700 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
1e710 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
1e720 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
1e730 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1e740 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
1e750 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1e760 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
1e770 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d 65 6c  ize(pVfs);.  }el
1e780 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
1e790 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
1e7a0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1e7b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
1e7c0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
1e7d0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
1e7e0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
1e7f0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
1e800 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
1e810 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
1e820 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1e830 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
1e840 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
1e850 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
1e860 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
1e870 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
1e880 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
1e890 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
1e8a0 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
1e8b0 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
1e8c0 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
1e8d0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1e8e0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1e8f0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
1e900 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
1e910 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
1e920 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1e930 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
1e940 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
1e950 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
1e960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e970 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
1e980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e990 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
1e9a0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
1e9b0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
1e9c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
1e9d0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
1e9e0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
1e9f0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1ea00 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
1ea10 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
1ea20 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
1ea30 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
1ea40 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
1ea50 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
1ea60 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
1ea70 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
1ea80 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
1ea90 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
1eaa0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
1eab0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
1eac0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
1ead0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1eae0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
1eaf0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
1eb00 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1eb10 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
1eb20 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
1eb30 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
1eb40 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
1eb50 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1eb60 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
1eb70 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
1eb80 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1eb90 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
1eba0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
1ebb0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1ebc0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
1ebd0 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
1ebe0 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
1ebf0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
1ec00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1ec10 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
1ec20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
1ec30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
1ec40 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
1ec50 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1ec60 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1ec70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1ec80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ec90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1eca0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1ecb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ecc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ecd0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
1ece0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
1ecf0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
1ed00 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
1ed10 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
1ed20 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
1ed30 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
1ed40 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
1ed50 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
1ed60 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
1ed70 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
1ed80 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1ed90 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
1edc0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
1edd0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
1ee00 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
1ee10 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
1ee20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
1ee30 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
1ee40 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
1ee50 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
1ee60 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
1ee70 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1ee80 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1ee90 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
1eea0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1eeb0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1eec0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1eed0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1eee0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
1eef0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1ef00 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
1ef10 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
1ef20 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
1ef30 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
1ef40 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
1ef50 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
1ef60 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1ef70 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
1ef80 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
1ef90 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
1efa0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61  cture */.    pca
1efb0 63 68 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20  cheSize      +  
1efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
1efd0 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
1efe0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20   pVfs->szOsFile 
1eff0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
1f000 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
1f010 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
1f020 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
1f030 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
1f040 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
1f050 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f060 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
1f070 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1f080 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f090 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1f0a0 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
1f0b0 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72    );.  if( !pPtr
1f0c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f0d0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1f0e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f0f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
1f100 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
1f110 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
1f120 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
1f130 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
1f140 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 73  ache*)(pPtr += s
1f150 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 3b  izeof(*pPager));
1f160 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
1f170 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1f180 29 28 70 50 74 72 20 2b 3d 20 70 63 61 63 68 65  )(pPtr += pcache
1f190 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
1f1a0 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
1f1b0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
1f1c0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
1f1d0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
1f1e0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1f1f0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
1f200 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
1f210 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
1f220 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
1f230 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
1f240 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  Size);..  /* Fil
1f250 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f260 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f270 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f280 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f290 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f2a0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f2b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f2c0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f2d0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f2e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f2f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f300 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f310 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1f320 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1f330 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1f340 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f350 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1f360 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1f370 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1f380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1f390 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f3a0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
1f3b0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
1f3c0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
1f3d0 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
1f3e0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
1f3f0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1f400 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1f410 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
1f420 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
1f430 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
1f440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f450 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
1f460 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
1f470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f480 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1f490 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f4a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
1f4b0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
1f4c0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
1f4d0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1f4e0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
1f4f0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1f500 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
1f510 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
1f520 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
1f530 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
1f540 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
1f550 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
1f560 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
1f570 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1f580 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
1f590 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
1f5a0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
1f5b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
1f5c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1f5d0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
1f5e0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
1f5f0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1f600 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
1f610 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1f620 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
1f630 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
1f640 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
1f650 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1f660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f670 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
1f680 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
1f690 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
1f6a0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1f6b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f6c0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
1f6d0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f6e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
1f6f0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
1f700 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
1f710 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1f720 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
1f730 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f740 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
1f750 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f760 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
1f770 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f780 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f790 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
1f7a0 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61  eDflt = (u16)pPa
1f7b0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
1f7c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f7d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1f7e0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1f7f0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
1f800 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
1f810 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1f820 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1f830 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1f840 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1f850 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1f860 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1f870 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
1f880 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f890 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
1f8a0 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
1f8b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f8c0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f8d0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
1f8e0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
1f8f0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
1f900 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
1f910 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f920 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
1f930 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
1f940 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f950 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
1f960 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
1f970 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
1f980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f990 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1f9a0 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
1f9b0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
1f9c0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
1f9d0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1f9e0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
1f9f0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
1fa00 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
1fa10 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
1fa20 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
1fa30 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
1fa40 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
1fa50 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1fa60 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
1fa70 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
1fa80 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
1fa90 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
1faa0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1fab0 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
1fac0 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
1fad0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
1fae0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
1faf0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
1fb00 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
1fb10 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
1fb20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
1fb30 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
1fb40 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
1fb50 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
1fb60 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1fb70 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1fb80 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  E;.  }..  /* The
1fb90 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
1fba0 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
1fbb0 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
1fbc0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
1fbd0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
1fbe0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
1fbf0 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
1fc00 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
1fc10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
1fc20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fc30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fc40 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
1fc50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fc60 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1fc70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
1fc80 6c 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  lt);.    testcas
1fc90 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1fca0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
1fcb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
1fcc0 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
1fcd0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
1fce0 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
1fcf0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1fd00 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
1fd10 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
1fd20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fd30 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1fd40 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
1fd50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
1fd60 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
1fd70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1fd80 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
1fd90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1fda0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1fdb0 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
1fdc0 74 2e 20 2a 2f 0a 20 20 6e 45 78 74 72 61 20 3d  t. */.  nExtra =
1fdd0 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
1fde0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
1fdf0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
1fe00 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
1fe10 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
1fe30 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
1fe40 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
1fe50 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
1fe60 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
1fe70 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
1fe80 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
1fe90 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
1fea0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1feb0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1fec0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
1fed0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
1fee0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
1fef0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1ff00 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
1ff10 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
1ff20 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
1ff30 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
1ff40 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
1ff50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
1ff60 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
1ff70 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1ff80 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
1ff90 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
1ffa0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1ffb0 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
1ffc0 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
1ffd0 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
1ffe0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
1fff0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
20000 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
20010 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
20020 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
20030 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
20040 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
20050 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
20060 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
20070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20080 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
20090 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
200a0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
200b0 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
200c0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
200d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
200e0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
200f0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
20100 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
20110 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
20120 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
20130 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
20140 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
20150 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
20160 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
20170 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
20180 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
20190 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
201a0 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
201b0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
201c0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
201d0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
201e0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
201f0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
20200 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
20210 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
20220 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20230 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
20240 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50  er->noSync = (pP
20250 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
20260 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f  | !useJournal) ?
20270 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
20280 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
20290 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
202a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
202b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
202c0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
202d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
202e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
202f0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
20300 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20310 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
20320 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
20330 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20  tra = nExtra;.  
20340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
20350 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
20360 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
20370 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
20380 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
20390 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
203a0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
203b0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
203c0 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44 62 20 29  );.  if( memDb )
203d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
203e0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
203f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
20400 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
20410 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
20420 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
20430 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
20440 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
20450 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
20460 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
20470 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
20480 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
20490 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
204a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
204b0 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
204c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
204d0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
204e0 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
204f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
20500 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
20510 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
20520 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
20530 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
20540 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
20550 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
20560 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
20570 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
20580 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
20590 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
205a0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
205b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
205c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
205d0 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
205e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
205f0 65 65 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ee criteria are 
20600 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
20610 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20620 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
20630 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
20640 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
20650 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
20660 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
20670 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20680 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
20690 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
206a0 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
206b0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
206c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
206d0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
206e0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
206f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
20700 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
20710 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
20720 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
20730 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
20740 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
20750 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
20760 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
20770 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
20780 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
20790 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
207a0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
207b0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
207c0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
207d0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
207e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
207f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20800 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a  s not open the j
20810 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
20820 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f  xamine its.** co
20830 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74  ntent.  Hence, t
20840 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
20850 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d   contain the nam
20860 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a  e of a master.**
20870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
20880 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  at has been dele
20890 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e  ted, and hence n
208a0 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a  ot be hot.  Or.*
208b0 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
208c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
208d0 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e  t be zeroed out.
208e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
208f0 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f  * does not disco
20900 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20  ver these cases 
20910 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  of a non-hot jou
20920 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a  rnal - if the.**
20930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
20940 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
20950 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69  empty this routi
20960 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a  ne assumes it.**
20970 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61   is hot.  The pa
20980 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
20990 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
209a0 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a  over that the.**
209b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
209c0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
209d0 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a  and will no-op..
209e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
209f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
20a00 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
20a10 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20a20 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
20a30 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
20a40 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
20a50 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
20a60 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
20a70 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
20a80 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20a90 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
20aa0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
20ab0 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
20ac0 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
20ad0 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
20ae0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
20af0 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
20b00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20b10 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
20b20 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
20b30 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
20b40 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
20b50 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
20b60 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
20b70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
20b80 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
20b90 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
20ba0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20bc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20bd0 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 30    int exists = 0
20be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20bf0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
20c00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
20c10 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  sent */.  int lo
20c20 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  cked = 0;       
20c30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20c40 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
20c50 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
20c60 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 61 73 73 65   lock */..  asse
20c70 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
20c80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20c90 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
20ca0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
20cb0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
20cc0 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
20cd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
20ce0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
20cf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
20d00 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
20d10 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
20d20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20d30 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
20d40 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20d50 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
20d60 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
20d70 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
20d80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20d90 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
20da0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
20db0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20dc0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20dd0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
20de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20e00 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
20e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
20e20 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
20e30 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
20e40 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
20e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e60 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
20e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
20e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20ea0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
20eb0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
20ec0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
20ed0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
20ee0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
20ef0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
20f00 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
20f10 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
20f20 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
20f30 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
20f40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
20f60 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
20f70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
20f80 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
20f90 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
20fa0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
20fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20fc0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
20fd0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
20fe0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
20ff0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
21000 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
21010 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
21020 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21030 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21040 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
21050 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
21060 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21070 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
21080 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
21090 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
210a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
210b0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
210c0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
210d0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
210e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
210f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21100 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21110 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21130 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
21140 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
21150 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21160 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21170 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
21180 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21  EMDB );..  if( !
21190 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
211a0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
211b0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
211c0 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
211d0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
211e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
211f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
21200 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
21210 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 4f 66  _READ;.  }.  iOf
21220 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
21230 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
21240 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  eSize;.  rc = sq
21250 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
21260 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
21270 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
21280 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a  Size, iOffset);.
21290 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
212a0 0a 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56  .    u8 *dbFileV
212b0 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
212c0 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
212d0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
212e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
212f0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
21300 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
21310 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44  ers));.  }.  COD
21320 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
21330 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29  >pData, pgno, 3)
21340 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
21350 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
21360 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
21370 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
21380 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
21390 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
213a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
213b0 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
213c0 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
213d0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
213e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
213f0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
21400 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
21410 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
21420 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21430 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21440 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
21450 77 68 65 6e 65 76 65 72 20 74 68 65 20 75 70 70  whenever the upp
21460 65 72 20 6c 61 79 65 72 20 72 65 71 75 65 73 74  er layer request
21470 73 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  s a database.** 
21480 70 61 67 65 20 69 73 20 72 65 71 75 65 73 74 65  page is requeste
21490 64 2c 20 62 65 66 6f 72 65 20 74 68 65 20 63 61  d, before the ca
214a0 63 68 65 20 69 73 20 63 68 65 63 6b 65 64 20 66  che is checked f
214b0 6f 72 20 61 20 73 75 69 74 61 62 6c 65 20 70 61  or a suitable pa
214c0 67 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74  ge.** or any dat
214d0 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  a is read from t
214e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 74 20  he database. It 
214f0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c  performs the fol
21500 6c 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75  lowing.** two fu
21510 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
21520 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
21530 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
21540 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
21550 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
21560 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
21570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
21580 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
21590 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
215a0 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
215b0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
215c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
215d0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
215e0 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
215f0 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
21600 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
21610 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
21620 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
21630 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
21640 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
21650 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
21660 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
21670 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
21680 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
21690 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
216a0 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
216b0 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
216c0 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
216d0 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
216e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
216f0 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
21700 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
21710 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
21720 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
21730 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
21740 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
21750 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
21760 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
21770 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
21780 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
21790 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
217a0 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
217b0 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
217c0 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
217d0 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
217e0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
217f0 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
21800 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
21810 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
21820 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
21830 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
21840 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
21850 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
21860 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
21870 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
21880 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29  described by (2)
21890 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74   above is not at
218a0 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20  tempted, and if 
218b0 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20  the.** pager is 
218c0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
218d0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
218e0 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68  ITE_FULL when th
218f0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  is is called,.**
21900 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
21910 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
21920 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70  eturned. It is p
21930 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64  ermitted to read
21940 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
21950 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f   when in SQLITE_
21960 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65  FULL error state
21970 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
21980 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
21990 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
219a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
219b0 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
219c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
219d0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
219e0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
219f0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
21a00 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f  ournal.** file o
21a10 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
21a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
21a30 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
21a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21a50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
21a60 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
21a70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21a80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21aa0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21ab0 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72  */.  int isError
21ac0 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  Reset = 0;      
21ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21ae0 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72  if recovering fr
21af0 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  om error state *
21b00 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
21b10 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
21b20 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
21b30 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
21b40 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
21b50 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
21b60 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
21b70 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73  rror-state, this
21b80 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
21b90 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
21ba0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
21bb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
21bc0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
21bd0 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
21be0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
21bf0 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
21c00 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
21c10 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
21c20 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
21c30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
21c40 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
21c50 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
21c60 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
21c70 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  ode .  ){.    if
21c80 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21c90 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
21ca0 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b  sErrorReset = 1;
21cb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
21cc0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
21cd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65  ITE_OK;.    page
21ce0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
21cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
21d00 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c  e pager is still
21d10 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
21d20 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65  te, do not proce
21d30 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20  ed. The error . 
21d40 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62   ** state will b
21d50 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d  e cleared at som
21d60 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
21d70 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70  uture when all p
21d80 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  age .  ** refere
21d90 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64  nces are dropped
21da0 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63   and the cache c
21db0 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  an be discarded.
21dc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
21dd0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
21de0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
21df0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
21e00 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
21e10 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
21e20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21e30 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
21e40 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65  K || isErrorRese
21e50 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
21e60 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
21e70 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
21e80 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a  ;.    int isHotJ
21e90 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
21ea0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
21eb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
21ec0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
21ed0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
21ee0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  che)==0 );.    i
21ef0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65  f( !pPager->noRe
21f00 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
21f10 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
21f20 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
21f30 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
21f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21f60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21f70 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
21f80 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
21f90 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
21fa0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
21fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
21fc0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
21fd0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
21fe0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
21ff0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
22000 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
22010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22020 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
22030 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  _LOCK );..    /*
22040 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
22050 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
22060 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
22070 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
22080 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22090 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
220a0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
220b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
220c0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
220d0 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
220e0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72  Reset ){.      r
220f0 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
22100 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
22110 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
22120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22130 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
22140 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
22150 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
22160 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
22170 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
22180 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
22190 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
221a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
221b0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
221c0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
221d0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
221e0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
221f0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
22200 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
22210 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
22220 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
22230 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
22240 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
22250 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
22260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
22270 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
22280 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
22290 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
222a0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
222b0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
222c0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
222d0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
222e0 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
222f0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
22300 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
22310 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
22320 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
22330 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
22340 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
22350 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
22360 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
22370 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
22380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22390 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
223a0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
223b0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
223c0 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
223d0 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
223e0 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
223f0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
22400 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
22410 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
22420 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
22430 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
22440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22450 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
22460 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
22470 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
22480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22490 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
224a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
224b0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
224c0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
224d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
224e0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
224f0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
22500 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  VE;.      }. .  
22510 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
22520 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
22530 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
22540 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
22550 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n .      ** excl
22560 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
22570 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22580 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
22590 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
225a0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
225b0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
225c0 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
225d0 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
225e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54  the.      ** OsT
225f0 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
22600 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
22610 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
22620 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
22630 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
22640 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
22650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22660 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
22670 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
22680 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
22690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
226a0 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
226b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
226c0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
226d0 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  S,&res);.       
226e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
226f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22700 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
22710 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
22720 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
22730 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
22740 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
22750 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
22760 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
22770 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
22780 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
22790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
227a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
227b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
227c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
227d0 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
227e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
227f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22800 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
22810 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
22820 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
22830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
22840 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
22850 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
22860 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
22870 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22890 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
228a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
228b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
228c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
228d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
228e0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
228f0 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e  exist, that mean
22900 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
22910 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20  cess.           
22920 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
22930 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a  rolled it back *
22940 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
22950 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
22960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22970 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
229a0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
229b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
229c0 54 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68  TODO: Why are th
229d0 65 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65  ese cleared here
229e0 3f 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72  ? Is it necessar
229f0 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  y? */.      pPag
22a00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
22a10 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
22a20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22a30 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
22a40 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
22a50 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
22a60 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
22a70 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
22a80 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
22a90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
22aa0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
22ab0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
22ac0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
22ad0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
22ae0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
22af0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
22b00 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
22b10 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
22b20 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
22b30 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
22b40 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
22b50 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20  ent cache..     
22b60 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
22b70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
22b80 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
22b90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22ba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
22bb0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
22bc0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
22bd0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
22be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
22bf0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
22c00 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
22c10 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ED).           |
22c20 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
22c30 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
22c40 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
22c50 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
22c60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22c70 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
22c80 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
22c90 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
22ca0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
22cb0 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
22cc0 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
22cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22ce0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
22cf0 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
22d00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
22d10 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
22d20 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
22d30 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
22d40 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
22d50 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
22d60 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
22d70 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
22d80 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
22d90 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
22da0 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
22db0 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
22dc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
22dd0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
22de0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
22df0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
22e00 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
22e10 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
22e20 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
22e30 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
22e40 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
22e50 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
22e60 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
22e70 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
22e80 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
22e90 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
22ea0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
22eb0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
22ec0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
22ed0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
22ee0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
22ef0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
22f00 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
22f10 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
22f20 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
22f30 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
22f40 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
22f50 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
22f60 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
22f70 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
22f80 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
22f90 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
22fa0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
22fb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
22fc0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
22fd0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
22fe0 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73  eVers)];.      s
22ff0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
23000 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
23010 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
23020 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
23030 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67         rc = pPag
23040 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
23050 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
23060 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23070 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23080 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
23090 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
230a0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
230b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
230c0 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
230d0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
230e0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
230f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23100 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
23110 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
23120 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
23130 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
23140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23160 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
23190 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
231a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
231b0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
231c0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
231d0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
231e0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
231f0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
23200 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
23210 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
23220 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
23230 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
23240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
23250 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
23260 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
23270 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d  ER_SHARED );.  }
23280 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
23290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
232a0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
232b0 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
232c0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
232d0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
232e0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
232f0 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
23300 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
23310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23320 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
23330 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
23340 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
23350 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
23360 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
23370 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
23380 20 70 61 67 65 72 2e 0a 2a 2f 20 0a 73 74 61 74   pager..*/ .stat
23390 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
233a0 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
233b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
233c0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
233d0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
233e0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20  pPCache)==0 ){. 
233f0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
23400 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
23410 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23420 44 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d  Drop a page from
23430 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
23440 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
23450 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  op()..**.** If t
23460 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20  his means there 
23470 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73  are now no pages
23480 20 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73   with references
23490 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c   to them, a roll
234a0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61  back.** occurs a
234b0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
234c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
234d0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  emoved..*/.stati
234e0 63 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70  c void pagerDrop
234f0 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67  Page(DbPage *pPg
23500 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
23510 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
23520 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
23530 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61  eDrop(pPg);.  pa
23540 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
23550 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  d(pPager);.}../*
23560 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
23570 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
23580 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
23590 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
235a0 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
235b0 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
235c0 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
235d0 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
235e0 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
235f0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
23600 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
23610 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
23620 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
23630 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23640 20 63 61 6c 6c 73 20 70 61 67 65 72 53 68 61 72   calls pagerShar
23650 65 64 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61  edLock() to obta
23660 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
23670 20 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   on.** the datab
23680 61 73 65 20 66 69 6c 65 20 69 66 20 73 75 63 68  ase file if such
23690 20 61 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74   a lock or great
236a0 65 72 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  er is not alread
236b0 79 20 68 65 6c 64 2e 0a 2a 2a 20 54 68 69 73 20  y held..** This 
236c0 6d 61 79 20 63 61 75 73 65 20 68 6f 74 2d 6a 6f  may cause hot-jo
236d0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
236e0 72 20 61 20 63 61 63 68 65 20 70 75 72 67 65 2e  r a cache purge.
236f0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a   See comments.**
23700 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
23710 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
23720 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
23730 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
23740 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
23750 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
23760 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
23770 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
23780 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
23790 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
237a0 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
237b0 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
237c0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
237d0 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
237e0 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
237f0 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
23800 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
23810 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
23820 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
23830 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
23840 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
23850 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
23860 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
23870 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
23880 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
23890 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
238a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
238b0 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
238c0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
238d0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
238e0 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
238f0 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
23900 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
23910 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
23920 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23930 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
23940 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
23950 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
23960 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
23970 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
23980 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23990 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
239a0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
239b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
239c0 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
239d0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
239e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
239f0 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
23a00 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
23a10 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
23a20 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
23a30 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
23a40 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
23a50 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
23a60 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
23a70 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
23a80 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
23a90 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
23aa0 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
23ab0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
23ac0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
23ad0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
23ae0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
23af0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
23b00 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
23b10 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
23b20 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
23b30 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
23b40 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
23b50 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
23b60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
23b70 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
23b80 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
23b90 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
23ba0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
23bb0 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
23bc0 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
23bd0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
23be0 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 77 69  e to populate wi
23bf0 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
23c00 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
23c10 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
23c20 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
23c30 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
23c40 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
23c50 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
23c60 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
23c70 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
23c80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
23c90 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
23ca0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
23cb0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
23cc0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
23cd0 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
23ce0 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
23cf0 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
23d00 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
23d10 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
23d20 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
23d30 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
23d40 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
23d50 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
23d60 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
23d70 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
23d80 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
23d90 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
23da0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
23db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23dc0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
23dd0 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
23de0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
23df0 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
23e00 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
23e10 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
23e20 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
23e30 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
23e40 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
23e50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
23e60 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
23e70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
23e80 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
23e90 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
23ea0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
23eb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
23ec0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
23ed0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
23ee0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
23ef0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
23f00 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
23f10 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
23f20 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
23f30 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
23f40 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
23f50 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
23f60 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
23f70 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
23f80 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
23f90 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
23fa0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
23fb0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
23fc0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
23fd0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
23fe0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
23ff0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
24000 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
24010 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
24020 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
24030 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
24040 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
24050 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
24060 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
24070 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
24080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
24090 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
240a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
240b0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
240c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
240d0 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
240e0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
240f0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
24100 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
24110 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
24120 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
24130 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
24140 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
24150 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
24160 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50  f true */.){.  P
24170 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
24180 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
24190 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
241a0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
241b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
241c0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
241d0 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20  _UNLOCK .       
241e0 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
241f0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
24200 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
24210 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20      || pgno==1. 
24220 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
24230 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
24240 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
24250 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24260 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
24270 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
24280 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
24290 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
242a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
242b0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
242c0 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
242d0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
242e0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
242f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24300 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24310 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
24320 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
24330 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
24340 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
24350 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
24360 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
24370 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
24380 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
24390 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
243a0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
243b0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
243c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
243d0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
243e0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
243f0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
24400 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
24410 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
24420 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
24430 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
24440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24450 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24460 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
24470 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
24480 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
24490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
244a0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
244b0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
244c0 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
244d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
244e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
244f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
24500 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
24510 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
24520 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
24530 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
24540 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  );.  if( pPg->pP
24550 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ager==0 ){.    /
24560 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
24570 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
24580 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
24590 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
245a0 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
245b0 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  lized..    */.  
245c0 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
245d0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
245e0 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
245f0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
24600 67 65 72 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ger;..    rc = s
24610 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
24620 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
24630 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
24640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24650 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24660 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
24670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24680 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78   }..    if( nMax
24690 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
246a0 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  MDB || noContent
246b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
246c0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
246d0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
246e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
246f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
24700 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
24710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24720 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
24730 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
24740 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
24750 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
24760 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
24770 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
24780 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
24790 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
247a0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
247b0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
247c0 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
247d0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
247e0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
247f0 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
24800 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
24810 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
24820 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
24830 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
24840 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
24850 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
24860 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
24870 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
24880 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24890 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
248a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
248b0 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
248c0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
248d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
248e0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
248f0 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
24900 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
24910 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
24920 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
24940 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
24950 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
24960 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
24970 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
24980 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
24990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
249a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
249b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
249c0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
249d0 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oc();.      }els
249e0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
249f0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
24a00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
24a10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
24a20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
24a30 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
24a40 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
24a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
24a60 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
24a70 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
24a80 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
24a90 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
24aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
24ab0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
24ac0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
24ad0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 44 72  .        pagerDr
24ae0 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  opPage(pPg);.   
24af0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
24b10 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
24b20 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
24b30 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
24b40 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
24b50 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
24b60 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
24b70 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
24b80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
24b90 20 2a 2f 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   */.    PAGER_IN
24ba0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
24bb0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65  ;.  }..  *ppPage
24bc0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
24bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24be0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
24bf0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
24c00 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
24c10 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
24c20 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
24c30 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
24c40 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
24c50 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
24c60 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
24c70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
24c80 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72  che. Also, retur
24c90 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70  n 0 if the .** p
24ca0 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
24cb0 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68  _UNLOCK state wh
24cc0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24cd0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f   is called,.** o
24ce0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  r if the pager i
24cf0 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
24d00 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
24d10 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a  QLITE_FULL..**.*
24d20 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
24d30 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
24d40 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
24d50 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
24d60 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
24d70 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
24d80 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
24d90 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
24da0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
24db0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
24dc0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
24dd0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
24de0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
24df0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
24e00 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
24e10 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
24e20 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
24e30 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
24e40 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
24e50 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
24e60 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
24e70 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
24e80 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
24e90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
24ea0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
24eb0 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66  pgno!=0 );..  if
24ec0 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
24ed0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a  !=PAGER_UNLOCK).
24ee0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
24ef0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
24f00 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  K || pPager->err
24f10 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
24f20 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  L).  ){.    sqli
24f30 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
24f40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
24f50 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
24f60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
24f70 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
24f80 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
24f90 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
24fa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
24fb0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
24fc0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
24fd0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
24fe0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
24ff0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
25000 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
25010 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
25020 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
25030 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
25040 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
25050 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
25060 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
25070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25080 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
25090 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
250a0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
250b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
250c0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
250d0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
250e0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
250f0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
25100 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
25110 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
25120 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c  rnal file has al
25130 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
25140 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  d, ensure that t
25150 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  he.** sub-journa
25160 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74  l file is open t
25170 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  oo. If the main 
25180 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f  journal is not o
25190 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  pen,.** this fun
251a0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
251b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
251c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
251d0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
251e0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
251f0 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54  an. .** An SQLIT
25200 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
25210 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25220 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
25230 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  .** sqlite3OsOpe
25240 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  n() fails..*/.st
25250 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
25260 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25270 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
25280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25290 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
252a0 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
252b0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
252c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
252d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
252e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
252f0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
25300 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
25310 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
25320 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
25330 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
25340 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
25350 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
25360 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
25370 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
25380 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
253a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
253b0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
253c0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
253d0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
253e0 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
253f0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
25400 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
25410 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
25420 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
25430 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
25440 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
25450 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
25460 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
25470 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
25480 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
25490 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
254a0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
254b0 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
254c0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
254d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
254e0 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
254f0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
25500 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
25510 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
25520 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
25530 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
25540 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
25550 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
25560 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
25570 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
25580 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
25590 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
255a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
255b0 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
255c0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
255d0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
255e0 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
255f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
25600 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
25610 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
25620 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
25630 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
25640 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
25650 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
25660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
25670 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
25680 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
25690 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
256a0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
256b0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
256c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
256d0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
256e0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
256f0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
25700 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
25710 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
25720 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
25730 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
25740 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
25750 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
25760 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
25770 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
25780 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
25790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
257a0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
257b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
257c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
257d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
25800 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
25810 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
25820 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
25830 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
25840 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
25850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25860 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
25870 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
25880 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
25890 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
258a0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
258b0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
258c0 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
258d0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
258e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
258f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
25900 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
25910 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
25920 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
25930 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ode;.  }..  /* T
25940 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61 6c 6c  ODO: Is it reall
25950 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65  y possible to ge
25960 74 20 68 65 72 65 20 77 69 74 68 20 64 62 53 69  t here with dbSi
25970 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e  zeValid==0? If n
25980 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c  ot,.  ** the cal
25990 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65 63 6f  l to PagerPageco
259a0 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72 65 6d  unt() can be rem
259b0 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  oved..  */.  tes
259c0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
259d0 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b  bSizeValid==0 );
259e0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
259f0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
25a00 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   0);..  pPager->
25a10 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
25a20 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
25a30 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
25a40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
25a50 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
25a60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25a70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
25a80 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
25a90 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
25aa0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
25ab0 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69  pen. */.  if( !i
25ac0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25ad0 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
25ae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
25af0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
25b00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
25b10 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
25b20 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
25b30 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
25b40 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
25b50 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b70 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
25b80 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
25b90 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
25ba0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25bb0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  |SQLITE_OPEN_EXC
25bc0 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
25bd0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
25be0 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
25bf0 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
25c00 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
25c10 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
25c20 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
25c30 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
25c40 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
25c50 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
25c60 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53       );.#ifdef S
25c70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
25c80 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
25c90 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
25ca0 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
25cb0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
25cc0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
25cd0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
25ce0 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
25cf0 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23  ager).      );.#
25d00 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
25d10 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
25d20 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
25d30 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
25d40 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
25d50 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61  ndif.    }.    a
25d60 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
25d70 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
25d80 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
25d90 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   }...  /* Write 
25da0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
25db0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
25dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
25dd0 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20   open .  ** the 
25de0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
25df0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
25e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25e10 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44  OK ){.    /* TOD
25e20 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
25e30 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
25e40 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
25e50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  .    pPager->dbO
25e60 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
25e70 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50  ->dbSize;.    pP
25e80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
25e90 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  rted = 0;.    pP
25ea0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
25eb0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
25ec0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  nRec = 0;.    pP
25ed0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
25ee0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
25ef0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
25f00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
25f10 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
25f20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
25f30 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
25f40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
25f50 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
25f60 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->nSavepoint ){.
25f70 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
25f80 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
25f90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
25fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25fb0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
25fc0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
25fd0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
25fe0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
25ff0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
26000 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26010 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
26020 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
26030 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
26040 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
26050 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
26060 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
26070 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
26080 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26090 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
260a0 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
260b0 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
260c0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
260d0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
260e0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
260f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26100 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
26110 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
26120 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
26130 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
26140 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
26150 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
26160 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
26170 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
26180 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
26190 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
261a0 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
261b0 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68  ory file and, th
261c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
261d0 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20  s .** opened if 
261e0 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  it has not been 
261f0 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74  already. For a t
26200 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74  emporary file, t
26210 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f  he opening .** o
26220 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26230 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
26240 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
26250 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
26260 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
26270 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20   journal. TODO: 
26280 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f  Why handle tempo
26290 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65  rary files diffe
262a0 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66  rently?.**.** If
262b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
262c0 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20  e is opened (or 
262d0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
262e0 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a   open), then a.*
262f0 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  * journal-header
26300 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
26310 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a  he start of it..
26320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26330 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
26340 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
26350 61 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ag){.  int rc = 
26360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
26370 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
26380 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
26390 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
263a0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
263b0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
263c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
263d0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
263e0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
263f0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
26400 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  pFile );..    /*
26410 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
26420 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
26430 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26440 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
26450 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  meter.    ** is 
26460 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
26470 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
26480 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
26490 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
264a0 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
264b0 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
264c0 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
264d0 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
264e0 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f  LUSIVE.    ** lo
264f0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
26500 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
26510 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
26520 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
26530 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
26540 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
26550 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
26560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26570 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
26580 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
26590 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28  ERVED;.      if(
265a0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
265b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
265c0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
265d0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
265e0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
265f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
26600 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73 20   required locks 
26610 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c 6c  were successfull
26620 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65 6e  y obtained, open
26630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
26640 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72 69   ** file and wri
26650 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
26660 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 69  rnal-header to i
26670 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
26680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26690 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
266a0 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20 70 50  urnal.     && pP
266b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
266c0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
266d0 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b  MODE_OFF .    ){
266e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
266f0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
26700 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
26710 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
26720 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
26730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26740 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
26750 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
26760 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
26770 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
26780 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61  cess mode the la
26790 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
267a0 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
267b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
267c0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
267d0 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
267e0 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
267f0 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
26800 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
26810 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
26820 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
26830 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20   and either was 
26840 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
26850 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64  ytes or its head
26860 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76  er was.    ** ov
26870 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a  erwritten with z
26880 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
26890 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
268a0 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
268b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
268c0 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
268d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
268e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
268f0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
26900 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
26910 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
26920 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
26930 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
26940 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26950 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  )));.  assert( !
26960 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26970 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
26980 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
26990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
269a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
269b0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
269c0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
269d0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
269e0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
269f0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
26a00 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
26a10 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
26a20 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
26a30 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
26a40 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
26a50 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
26a60 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
26a70 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
26a80 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
26a90 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
26aa0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
26ab0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
26ac0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
26ad0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
26ae0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
26af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26b00 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
26b10 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
26b20 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
26b30 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
26b40 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
26b50 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26b60 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
26b70 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
26b80 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
26b90 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
26ba0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
26bb0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
26bc0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
26bd0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
26be0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
26bf0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
26c00 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
26c10 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
26c20 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
26c30 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
26c40 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
26c50 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
26c60 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
26c70 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
26c80 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
26c90 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
26ca0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
26cb0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
26cc0 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
26cd0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
26ce0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
26cf0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  e(pPg) ){.    pP
26d00 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
26d10 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
26d20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
26d30 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
26d40 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
26d50 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
26d60 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
26d70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
26d80 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
26d90 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
26da0 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
26db0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
26dc0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
26dd0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
26de0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
26df0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
26e00 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
26e10 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
26e20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
26e30 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
26e40 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
26e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26e60 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c  gerBegin(pPager,
26e70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
26e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26e90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26ea0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
26eb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
26ec0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
26ed0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
26ee0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
26ef0 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
26f00 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26  rnal.          &
26f10 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
26f20 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
26f30 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
26f40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26f50 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
26f60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
26f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26f90 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  }.    pPager->db
26fa0 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Modified = 1;.  
26fb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
26fc0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
26fd0 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
26fe0 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
26ff0 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
27000 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
27010 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
27020 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
27030 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
27040 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
27050 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
27060 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
27070 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
27080 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
27090 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
270a0 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  ) && isOpen(pPag
270b0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
270c0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
270d0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
270e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
270f0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
27100 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
27110 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
27120 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
27130 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
27140 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
27150 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
27160 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
27170 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
27180 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
27190 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
271a0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
271b0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
271c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
271d0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
271e0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
271f0 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f       pData2 = CO
27200 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
27210 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
27220 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
27230 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
27240 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
27250 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
27260 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
27270 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
27280 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
27290 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
272a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
272b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
272c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
272d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
272e0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
272f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
27320 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
27330 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
27340 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27350 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
27360 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
27370 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
27380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27390 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
273a0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
273b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
273c0 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
273d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
273e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
273f0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
27400 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
27410 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
27420 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
27430 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
27450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27460 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27470 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
27480 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
27490 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
274a0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
274b0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
274c0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
274d0 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
274e0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
274f0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
27500 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
27510 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
27520 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
27530 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
27540 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
27550 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
27560 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
27570 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
27580 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
27590 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
275a0 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
275b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
275c0 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
275d0 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
275e0 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
275f0 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
27600 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
27610 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
27620 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
27630 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
27640 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
27650 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
27660 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
27670 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
27680 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
27690 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
276a0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
276b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
276c0 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
276d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
276e0 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
276f0 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
27700 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
27710 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
27720 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
27730 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
27740 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
27750 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
27760 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
27770 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
27780 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
27790 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
277a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
277b0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
277c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
277d0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
277e0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
277f0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
27800 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
27830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
27840 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
27850 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
27860 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
27870 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
27880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27890 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
278a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
278b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
278c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
278d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
278e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
278f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27900 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
27910 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
27920 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
27930 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
27940 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
27950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
27980 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
27990 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
279a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
279b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
279c0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
279d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
279e0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
279f0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
27a00 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
27a10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
27a20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
27a30 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
27a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27a50 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
27a60 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
27a70 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
27a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27a90 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
27aa0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
27ac0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
27ad0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
27ae0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27af0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
27b00 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
27b10 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
27b20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
27b30 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
27b40 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
27b50 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
27b60 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
27b70 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
27b80 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
27b90 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
27ba0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
27bb0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
27bc0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
27bd0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
27be0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
27bf0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
27c00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27c10 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
27c20 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
27c30 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
27c40 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
27c50 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
27c60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
27c70 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
27c80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
27c90 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
27ca0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
27cb0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
27cc0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
27cd0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
27ce0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
27cf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
27d10 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
27d20 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
27d30 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
27d40 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
27d50 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
27d60 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
27d70 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
27d80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
27d90 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
27da0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
27db0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
27dc0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
27dd0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
27de0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
27df0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
27e00 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
27e10 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
27e20 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
27e30 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
27e40 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
27e50 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
27e60 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
27e70 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
27e80 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
27e90 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
27ea0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
27eb0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
27ec0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
27ed0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
27ee0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
27ef0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
27f00 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
27f10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27f20 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
27f30 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
27f40 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27f50 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
27f60 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
27f70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
27f80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
27f90 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
27fa0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
27fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
27fc0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
27fd0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
27fe0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
27ff0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
28000 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
28010 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
28020 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28030 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
28040 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
28050 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
28060 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
28070 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
28080 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
28090 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
280a0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
280b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
280c0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
280d0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
280e0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
280f0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
28100 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28110 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
28120 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
28130 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
28140 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
28150 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28160 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
28170 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
28180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28190 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
281a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
281b0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
281c0 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
281d0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
281e0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
281f0 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
28200 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
28210 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
28220 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
28230 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
28240 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
28250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
28260 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
28270 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
28280 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
28290 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
282a0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
282b0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
282c0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
282d0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
282e0 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
282f0 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
28300 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
28310 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
28320 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
28330 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
28340 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
28350 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
28360 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
28370 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
28380 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
28390 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
283a0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
283b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
283c0 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
283d0 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
283e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
283f0 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
28400 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
28410 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
28420 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
28430 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
28440 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
28450 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
28460 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
28470 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
28480 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
28490 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
284a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
284b0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
284c0 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
284d0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
284e0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
284f0 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
28500 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
28510 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
28520 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
28530 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
28540 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
28550 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
28560 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
28570 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
28580 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
28590 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
285a0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
285b0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
285c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
285d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
285e0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
285f0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
28600 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28620 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
28630 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
28640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28650 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
28660 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
28670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
28680 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
28690 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
286a0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
286b0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
286c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
286d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
286e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
286f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
28710 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
28720 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
28730 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28740 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
28750 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
28760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
28770 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
28780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
28790 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
287a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
287b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
287c0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
287d0 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
287e0 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
287f0 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
28800 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
28810 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
28820 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
28830 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
28840 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
28850 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
28860 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
28870 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
28880 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
28890 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
288a0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
288b0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
288c0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
288d0 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
288e0 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
288f0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
28900 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
28910 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
28920 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
28930 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
28940 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
28950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
28960 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
28970 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b  && needSync; ii+
28980 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
28990 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
289a0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
289b0 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
289c0 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
289d0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66          pPage->f
289e0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
289f0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
28a00 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28a10 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
28a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28a30 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
28a40 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
28a50 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
28a60 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
28a70 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
28a80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
28a90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
28aa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
28ab0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
28ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28ad0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28ae0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
28af0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
28b00 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
28b10 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
28b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28b30 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
28b40 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
28b50 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
28b60 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
28b70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
28b80 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
28b90 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
28ba0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28bb0 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
28bc0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
28bd0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
28be0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
28bf0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
28c00 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
28c10 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
28c20 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
28c30 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
28c40 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
28c50 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
28c60 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
28c70 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
28c80 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
28c90 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
28ca0 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
28cb0 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
28cc0 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
28cd0 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
28ce0 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
28cf0 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
28d00 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
28d10 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
28d20 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
28d30 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
28d40 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
28d50 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
28d60 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
28d70 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
28d80 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
28d90 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
28da0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
28db0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
28dc0 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
28dd0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
28de0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
28df0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
28e00 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
28e10 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
28e20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
28e30 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
28e40 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
28e50 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
28e60 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
28e70 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
28e80 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
28e90 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
28ea0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
28eb0 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
28ec0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
28ed0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
28ee0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
28ef0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28f00 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
28f10 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
28f20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28f30 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
28f40 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
28f50 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
28f60 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
28f70 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
28f80 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
28f90 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
28fa0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
28fb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28fc0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
28fd0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
28fe0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
28ff0 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
29000 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
29010 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
29020 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
29030 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
29040 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
29050 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
29060 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
29070 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 69   isDirect flag i
29080 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
29090 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
290a0 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
290b0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
290c0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
290d0 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
290e0 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
290f0 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
29100 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
29110 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
29120 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
29130 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
29140 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
29150 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 20  ** The isDirect 
29160 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65  flag may only be
29170 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
29180 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
29190 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  piled.** with th
291a0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
291b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63  ATOMIC_WRITE mac
291c0 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74  ro defined. In t
291d0 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20  his case,.** if 
291e0 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d  isDirect is non-
291f0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
29200 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
29210 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79  updated directly
29220 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61  .** by writing a
29230 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f  n updated versio
29240 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e  n of page 1 usin
29250 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  g a call to the 
29260 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69  .** sqlite3OsWri
29270 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  te() function..*
29280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
29290 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
292a0 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
292b0 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
292c0 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63  tMode){.  int rc
292d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
292e0 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
292f0 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
29300 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
29310 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
29320 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
29330 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
29340 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
29350 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
29360 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
29370 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
29380 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
29390 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
293a0 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
293b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
293c0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
293d0 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
293e0 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
293f0 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
29400 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
29410 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
29420 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
29430 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
29440 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
29450 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
29460 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
29470 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
29480 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
29490 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
294a0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
294b0 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
294c0 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
294d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
294e0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
294f0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 44  .  const int isD
29500 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 61 73 73  irect = 0;.  ass
29510 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
29520 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
29530 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
29540 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
29550 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 44 69    const int isDi
29560 72 65 63 74 20 3d 20 69 73 44 69 72 65 63 74 4d  rect = isDirectM
29570 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ode;.#endif..  a
29580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
29590 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
295a0 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70  RVED );.  if( !p
295b0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
295c0 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
295d0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
295e0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
29610 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
29620 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
29630 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
29640 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
29650 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
29660 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
29670 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
29680 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
29690 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
296a0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
296b0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
296c0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
296d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
296e0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
296f0 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
29700 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
29710 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
29720 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
29730 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
29740 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
29750 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
29760 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
29770 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
29780 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
29790 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
297a0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
297b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
297c0 4f 4b 20 26 26 20 21 69 73 44 69 72 65 63 74 20  OK && !isDirect 
297d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
297e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
297f0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
29800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
29820 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
29830 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
29840 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
29850 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
29860 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
29870 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
29880 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
29890 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
298a0 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
298b0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
298c0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
298d0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
298e0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
298f0 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
29900 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
29910 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
29920 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29930 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
29940 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
29950 28 20 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20  ( isDirect ){.  
29960 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
29970 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
29980 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >pData;.        
29990 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
299a0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
299b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
299c0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
299d0 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
299e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
299f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
29a00 20 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68     /* If everyth
29a10 69 6e 67 20 77 6f 72 6b 65 64 2c 20 73 65 74 20  ing worked, set 
29a20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
29a30 6f 6e 65 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  one flag. */.   
29a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29a60 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
29a70 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
29a80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29a90 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
29aa0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
29ab0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
29ac0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
29ad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
29af0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
29b00 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
29b10 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
29b20 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
29b30 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
29b40 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
29b50 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
29b60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
29b70 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
29b80 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
29b90 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
29ba0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
29bb0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
29bc0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
29bd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29be0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
29bf0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
29c00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29c10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29c40 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 4d   code */.  if( M
29c50 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
29c60 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
29c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29c80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29c90 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
29ca0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
29cb0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
29cc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
29ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29cf0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
29d00 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
29d10 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
29d20 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
29d30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
29d40 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
29d50 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
29d60 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
29d70 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
29d80 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
29d90 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
29da0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
29db0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
29dc0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
29dd0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
29de0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
29df0 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
29e00 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
29e10 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
29e20 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
29e30 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
29e40 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
29e50 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
29e60 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
29e70 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
29e80 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
29e90 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
29ea0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
29eb0 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
29ec0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29ed0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
29ee0 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
29ef0 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
29f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
29f10 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
29f20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
29f30 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
29f40 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
29f50 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
29f60 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
29f70 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
29f80 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
29f90 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
29fa0 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
29fb0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
29fc0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
29fd0 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
29fe0 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
29ff0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
2a000 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
2a010 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
2a020 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
2a030 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
2a040 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
2a050 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
2a060 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
2a070 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
2a080 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2a090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a0a0 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
2a0b0 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
2a0c0 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
2a0d0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
2a0e0 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
2a0f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2a100 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
2a110 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
2a120 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
2a130 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2a140 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
2a150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a160 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2a170 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
2a180 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
2a190 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2a1a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
2a1b0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a1d0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
2a1e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2a1f0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
2a200 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
2a210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a220 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
2a230 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
2a240 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2a250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a270 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
2a280 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2a290 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
2a2a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2a2b0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2a2c0 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
2a2d0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
2a2e0 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
2a2f0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
2a300 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2a310 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
2a320 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20  dbSize));..  /* 
2a330 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
2a340 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
2a350 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
2a360 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
2a370 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2a380 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2a390 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
2a3a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
2a3b0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
2a3c0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2a3d0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
2a3e0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
2a3f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
2a400 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2a410 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
2a420 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61 67  R_SYNCED && pPag
2a430 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2a440 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  {..    /* The fo
2a450 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
2a460 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
2a470 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
2a480 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20  y how it.    ** 
2a490 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
2a4a0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
2a4b0 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
2a4c0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2a4d0 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  on.    ** was en
2a4e0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2a4f0 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
2a500 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
2a510 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  eets the .    **
2a520 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
2a530 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
2a540 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a  ration: .    **.
2a550 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
2a560 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2a570 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
2a580 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
2a590 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
2a5a0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
2a5b0 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20  ge-size, and .  
2a5c0 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
2a5d0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
2a5e0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
2a5f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
2a600 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  nd.    **    * E
2a610 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
2a620 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2a630 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
2a640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2a650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2a660 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2a670 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
2a680 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2a690 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
2a6a0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2a6b0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
2a6c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a6d0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
2a6e0 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f  change.    ** co
2a6f0 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
2a700 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
2a710 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2a720 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
2a730 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
2a740 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
2a750 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
2a760 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
2a770 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a  alCreate().    *
2a780 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
2a790 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a7a0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
2a7b0 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  n created, then 
2a7c0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  call.    ** page
2a7d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a7e0 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2a7f0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a800 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
2a810 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
2a820 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
2a830 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
2a840 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
2a850 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
2a860 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a  pplicable,.    *
2a870 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
2a880 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a890 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2a8a0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a8b0 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64  ter.    ** in 'd
2a8c0 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
2a8d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2a8e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
2a8f0 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20  never be.    ** 
2a900 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
2a910 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
2a920 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2a930 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2a940 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48 64 72  _WRITE.    PgHdr
2a950 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
2a960 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a970 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
2a980 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2a990 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a9a0 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20  _OFF );.    if( 
2a9b0 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70  !zMaster && isOp
2a9c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2a9d0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2a9e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
2a9f0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
2aa00 65 72 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  er) .     && pPa
2aa10 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
2aa20 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  ger->dbFileSize.
2aa30 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
2aa40 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2aa50 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2aa60 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
2aa70 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
2aa80 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55     ){.      /* U
2aa90 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
2aaa0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2aab0 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
2aac0 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
2aad0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  e .      ** foll
2aae0 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
2aaf0 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
2ab00 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
2ab10 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
2ab20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75       ** to inclu
2ab30 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63  de the updated c
2ab40 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
2ab50 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
2ab60 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69  e 1 .      ** di
2ab70 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
2ab80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63  tabase file. Bec
2ab90 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
2aba0 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20  ic-write .      
2abb0 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
2abc0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
2abd0 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
2abe0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2abf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2ac00 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2ac10 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2ac20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ac30 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2ac40 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2ac50 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2ac60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ac70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2ac80 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2ac90 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2aca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2acb0 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70  #else.    rc = p
2acc0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2acd0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2ace0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
2acf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ad00 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2ad10 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2ad20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
2ad30 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
2ad40 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2ad50 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
2ad60 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ll pages.    ** 
2ad70 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
2ad80 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
2ad90 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
2ada0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2adb0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68  .    ** file. Th
2adc0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2add0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
2ade0 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  m mode..    **. 
2adf0 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
2ae00 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
2ae10 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2ae20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2ae30 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
2ae40 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
2ae50 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
2ae60 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
2ae70 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  alue.    ** that
2ae80 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
2ae90 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
2aea0 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
2aeb0 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ise, the.    ** 
2aec0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2aed0 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
2aee0 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
2aef0 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a  nstead of .    *
2af00 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66  * reading data f
2af10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2af20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   file..    */.#i
2af30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2af40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2af50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2af60 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
2af70 69 67 53 69 7a 65 0a 20 20 20 20 20 26 26 20 70  igSize.     && p
2af80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2af90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2afa0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29  LMODE_OFF .    )
2afb0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20  {.      Pgno i; 
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2aff0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2b000 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70  const Pgno iSkip
2b010 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
2b020 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e  (pPager); /* Pen
2b030 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a  ding lock page *
2b040 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2b050 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
2b060 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
2b070 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
2b080 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
2b090 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2b0a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
2b0b0 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f  igSize;.      fo
2b0c0 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69  r( i=dbSize+1; i
2b0d0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2b0e0 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
2b0f0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
2b100 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
2b110 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2b120 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
2b130 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64  {.          PgHd
2b140 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
2b150 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
2b160 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2b170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b180 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2b190 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
2b1a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2b1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2b1c0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2b1d0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2b1e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b1f0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29  agerWrite(pPage)
2b200 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2b210 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2b220 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2b230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b240 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2b250 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2b260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b270 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  } .      pPager-
2b280 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
2b290 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2b2a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2b2b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b2c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
2b2d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
2b2e0 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20   master .    ** 
2b2f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2b300 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
2b310 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
2b320 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2b330 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d  .    ** or if zM
2b340 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e  aster is NULL (n
2b350 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
2b360 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  ), then this cal
2b370 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
2b380 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72    */.    rc = wr
2b390 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
2b3a0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
2b3b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b3c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2b3d0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2b3e0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
2b3f0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2b400 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f  file. If the ato
2b410 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2b420 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ization is being
2b430 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68  .    ** used, th
2b440 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
2b450 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
2b460 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
2b470 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72  orm any.    ** r
2b480 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20  eal IO..    */. 
2b490 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2b4a0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2b4b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b4c0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2b4d0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2b4e0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
2b4f0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
2b500 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b510 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ile. */.    rc =
2b520 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2b530 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61  elist(sqlite3Pca
2b540 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2b550 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
2b560 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b580 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2b590 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
2b5a0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f  );.      goto co
2b5b0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2b5c0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
2b5d0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
2b5e0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
2b5f0 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ache);..    /* I
2b600 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
2b610 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
2b620 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
2b630 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
2b640 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
2b650 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
2b660 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
2b670 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
2b680 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2b690 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
2b6a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2b6b0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2b6c0 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  New = pPager->db
2b6d0 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e  Size - (pPager->
2b6e0 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a  dbSize==PAGER_MJ
2b6f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
2b700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2b710 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2b720 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
2b730 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b740 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
2b750 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , nNew);.      i
2b760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b770 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2b780 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2b790 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
2b7a0 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
2b7b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b7c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
2b7d0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
2b7e0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
2b7f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2b800 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2b810 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2b820 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
2b830 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
2b840 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
2b850 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2b860 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
2b870 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65   }..commit_phase
2b880 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66 28  _one_exit:.  if(
2b890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
2b8a0 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
2b8b0 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
2b8c0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
2b8d0 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
2b8e0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
2b8f0 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 74 6f  e.    ** lock to
2b900 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
2b910 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
2b920 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
2b930 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  ince .    ** the
2b940 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2b950 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
2b960 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
2b970 0a 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74  .    ** better t
2b980 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
2b990 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f 0a 20 20  BUSY..    **/.  
2b9a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2b9b0 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  SY;.  }.  return
2b9c0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
2b9d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2b9e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
2b9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2ba00 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
2ba10 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
2ba20 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
2ba30 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
2ba40 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2ba50 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
2ba60 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
2ba70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
2ba80 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
2ba90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
2baa0 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
2bab0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
2bac0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
2bad0 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
2bae0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
2baf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
2bb00 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
2bb10 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
2bb20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
2bb30 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
2bb40 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2bb50 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
2bb60 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
2bb70 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
2bb80 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
2bb90 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
2bba0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
2bbb0 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
2bbc0 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
2bbd0 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
2bbe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
2bbf0 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
2bc00 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2bc10 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bc20 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2bc30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2bc40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
2bc50 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
2bc60 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
2bc70 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2bc80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2bc90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2bca0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
2bcb0 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
2bcc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2bcd0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bce0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2bcf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2bd00 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
2bd10 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
2bd20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
2bd30 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2bd40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2bd50 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
2bd60 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2bd70 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  de;.  }..  /* Th
2bd80 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2bd90 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
2bda0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2bdb0 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74   not in at least
2bdc0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .  ** PAGER_RESE
2bdd0 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20  RVED state. And 
2bde0 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65  indeed SQLite ne
2bdf0 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42  ver does this. B
2be00 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69  ut it is.  ** ni
2be10 63 65 20 74 6f 20 68 61 76 65 20 74 68 69 73 20  ce to have this 
2be20 64 65 66 65 6e 73 69 76 65 20 62 6c 6f 63 6b 20  defensive block 
2be30 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  here anyway..  *
2be40 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2be50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
2be60 52 5f 52 45 53 45 52 56 45 44 29 20 29 7b 0a 20  R_RESERVED) ){. 
2be70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2be80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
2be90 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
2bea0 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
2beb0 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
2bec0 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
2bed0 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
2bee0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
2bef0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2bf00 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2bf10 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
2bf20 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
2bf30 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
2bf40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2bf50 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
2bf60 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
2bf70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bf80 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2bf90 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
2bfa0 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
2bfb0 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
2bfc0 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
2bfd0 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
2bfe0 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
2bff0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
2c000 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
2c010 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
2c020 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
2c030 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
2c040 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
2c050 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2c060 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
2c070 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2c080 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
2c090 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
2c0a0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
2c0b0 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
2c0c0 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
2c0d0 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
2c0e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
2c0f0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
2c100 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2c110 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
2c120 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2c130 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2c140 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
2c150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c160 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
2c170 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2c180 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74  ager) );.    ret
2c190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c1a0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2c1b0 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
2c1c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2c1d0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2c1e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2c1f0 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
2c200 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
2c210 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72  bModified );.  r
2c220 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
2c230 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2c240 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2c250 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ter);.  return p
2c260 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2c270 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
2c280 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
2c290 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62  anges. The datab
2c2a0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
2c2b0 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
2c2c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
2c2d0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
2c2e0 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a  s two tasks:.**.
2c2f0 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73  **   1) It rolls
2c300 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61   back the journa
2c310 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e  l file, restorin
2c320 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  g all database f
2c330 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ile and .**     
2c340 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2c350 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74   pages to the st
2c360 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e  ate they were in
2c370 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
2c380 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61  ction.**      wa
2c390 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a  s opened, and.**
2c3a0 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a     2) It finaliz
2c3b0 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
2c3c0 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20  ile, so that it 
2c3d0 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  is not used for 
2c3e0 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  hot.**      roll
2c3f0 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e  back at any poin
2c400 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
2c410 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74  .**.** subject t
2c420 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2c430 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a  qualifications:.
2c440 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a  **.** * If the j
2c450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2c460 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e  ot yet open when
2c470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c480 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74  s called,.**   t
2c490 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20  hen only (2) is 
2c4a0 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68  performed. In th
2c4b0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2c4c0 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   no journal file
2c4d0 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61  .**   to roll ba
2c4e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69  ck..**.** * If i
2c4f0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2c500 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2c510 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61  TE_FULL, then ta
2c520 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20  sk (1) is .**   
2c530 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75  performed. If su
2c540 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28  ccessful, task (
2c550 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  2). Regardless o
2c560 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a  f the outcome.**
2c570 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68     of either, th
2c580 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
2c590 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c5a0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
2c5b0 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69  er.**   (i.e. ei
2c5c0 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
2c5d0 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52  R or SQLITE_CORR
2c5e0 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  UPT)..**.** * If
2c5f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2c600 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2c610 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2c620 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72  mpt (1). Whether
2c630 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29  .**   or not (1)
2c640 20 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20   is succussful, 
2c650 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29  also attempt (2)
2c660 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2c670 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c   return.**   SQL
2c680 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2c690 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  e, enter the err
2c6a0 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2c6b0 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a  urn the first .*
2c6c0 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65  *   error code e
2c6d0 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a  ncountered. .**.
2c6e0 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2c6f0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  e there is no ch
2c700 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61  ance that the da
2c710 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74  tabase was writt
2c720 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20  en to. .**   So 
2c730 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  is safe to final
2c740 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
2c750 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  file even if the
2c760 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20   playback .**   
2c770 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61  (operation 1) fa
2c780 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68  iled. However th
2c790 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74  e pager must ent
2c7a0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2c7b0 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63  te.**   as the c
2c7c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
2c7d0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61  n-memory cache a
2c7e0 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a  re now suspect..
2c7f0 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c  **.** * Finally,
2c800 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43   if in PAGER_EXC
2c810 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
2c820 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
2c830 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70  Only.**   attemp
2c840 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20  t (2) if (1) is 
2c850 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75  successful. Retu
2c860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2c870 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20  successful,.**  
2c880 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72   otherwise enter
2c890 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2c8a0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2c8b0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
2c8c0 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e  the .**   failin
2c8d0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  g operation..**.
2c8e0 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2c8f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
2c900 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ile may have bee
2c910 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f  n written to. So
2c920 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61   if the.**   pla
2c930 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2c940 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20  did not succeed 
2c950 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
2c960 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
2c970 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
2c980 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73  l file. It needs
2c990 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74   to be left in t
2c9a0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2c9b0 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65  o that.**   some
2c9c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
2c9d0 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73  an use it to res
2c9e0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
2c9f0 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20  e state (by.**  
2ca00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2ca10 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lback)..*/.int s
2ca20 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
2ca30 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
2ca40 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2ca50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ca60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ca70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
2ca80 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
2ca90 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
2caa0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2cab0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62   if( !pPager->db
2cac0 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f  Modified || !isO
2cad0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2cae0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2caf0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2cb00 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2cb10 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2cb20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2cb30 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
2cb40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
2cb50 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
2cb60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2cb70 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2cb80 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
2cb90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2cba0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
2cbb0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
2cbc0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
2cbd0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2cbe0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
2cbf0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20  ESERVED ){.     
2cc00 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
2cc10 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2cc20 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2cc30 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
2cc40 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2cc50 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2cc60 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2cc70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cc80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cc90 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
2cca0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2ccb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2ccc0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2ccd0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
2cce0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2ccf0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2cd00 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  eValid = 0;.    
2cd10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  }..    /* If an 
2cd20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
2cd30 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
2cd40 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
2cd50 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
2cd60 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  .    ** cache. S
2cd70 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
2cd80 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
2cd90 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
2cda0 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65  error .    ** pe
2cdb0 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f  rsistent..    */
2cdc0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2cdd0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2cde0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2cdf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2ce00 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2ce10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2ce20 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
2ce30 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
2ce40 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
2ce50 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
2ce60 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
2ce70 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  u8 sqlite3PagerI
2ce80 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
2ce90 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2cea0 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
2ceb0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
2cec0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2ced0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2cee0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
2cef0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
2cf00 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
2cf10 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2cf20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2cf30 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2cf40 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
2cf50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2cf60 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2cf70 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  s to the specifi
2cf80 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  ed page..*/.int 
2cf90 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2cfa0 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20  Refcount(DbPage 
2cfb0 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
2cfc0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  n sqlite3PcacheP
2cfd0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
2cfe0 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  e);.}..#ifdef SQ
2cff0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
2d000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2d010 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
2d020 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
2d030 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
2d040 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
2d050 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2d060 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
2d070 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74  ;.  a[0] = sqlit
2d080 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2d090 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d0a0 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69  );.  a[1] = sqli
2d0b0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
2d0c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2d0d0 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71  he);.  a[2] = sq
2d0e0 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61  lite3PcacheGetCa
2d0f0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
2d100 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d  pPCache);.  a[3]
2d110 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2d120 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70  eValid ? (int) p
2d130 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
2d140 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  -1;.  a[4] = pPa
2d150 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
2d160 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
2d170 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
2d180 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
2d190 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
2d1a0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
2d1b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
2d1c0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
2d1d0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
2d1e0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
2d1f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
2d200 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
2d210 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2d220 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2d230 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2d240 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  ry pager..*/.int
2d250 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
2d260 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
2d270 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
2d280 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  MDB;.}../*.** Ch
2d290 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 61  eck that there a
2d2a0 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76  re at least nSav
2d2b0 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74  epoint savepoint
2d2c0 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65  s open. If there
2d2d0 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
2d2e0 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76  y less than nSav
2d2f0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68  epoints open, th
2d300 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d  en open one or m
2d310 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a  ore savepoints.*
2d320 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65  * to make up the
2d330 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20   difference. If 
2d340 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
2d350 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65  vepoints is alre
2d360 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20  ady.** equal to 
2d370 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e  nSavepoint, then
2d380 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d390 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2d3a0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
2d3b0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53  ocation fails, S
2d3c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
2d3d0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
2d3e0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2d3f0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68  while opening th
2d400 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
2d410 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65  le, then an IO e
2d420 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20  rror code is.** 
2d430 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
2d440 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
2d450 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2d460 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
2d470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2d480 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b  int nSavepoint){
2d490 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d4a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d4c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2d4d0 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20   int nCurrent = 
2d4e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2d4f0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  nt;        /* Cu
2d500 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
2d510 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20  savepoints */.. 
2d520 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e   if( nSavepoint>
2d530 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 61 67  nCurrent && pPag
2d540 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2d550 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  {.    int ii;   
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d580 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2d590 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53  le */.    PagerS
2d5a0 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20  avepoint *aNew; 
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5c0 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61    /* New Pager.a
2d5d0 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
2d5e0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65  */..    /* Eithe
2d5f0 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63  r there is no ac
2d600 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tive journal or 
2d610 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2d620 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20 20 20  is open or .    
2d630 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
2d640 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
2d650 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20  in memory */.   
2d660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d670 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >nSavepoint==0 |
2d680 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
2d690 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20 20 20 20  >sjfd) ||.      
2d6a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d6b0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2d6c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2d6d0 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ORY );..    /* G
2d6e0 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61 53  row the Pager.aS
2d6f0 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75  avepoint array u
2d700 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20  sing realloc(). 
2d710 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
2d720 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  MEM.    ** if th
2d730 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  e allocation fai
2d740 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ls. Otherwise, z
2d750 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74  ero the new port
2d760 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20  ion in case a . 
2d770 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69     ** malloc fai
2d780 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
2d790 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20  e populating it 
2d7a0 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20  in the for(...) 
2d7b0 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20  loop below..    
2d7c0 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50  */.    aNew = (P
2d7d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29  agerSavepoint *)
2d7e0 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
2d7f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2d800 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65  aSavepoint, size
2d810 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
2d820 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20  t)*nSavepoint.  
2d830 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e    );.    if( !aN
2d840 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ew ){.      retu
2d850 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d860 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2d870 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74  t(&aNew[nCurrent
2d880 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e  ], 0, (nSavepoin
2d890 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69  t-nCurrent) * si
2d8a0 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
2d8b0 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65  int));.    pPage
2d8c0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
2d8d0 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67 65 72  aNew;.    pPager
2d8e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
2d8f0 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20  Savepoint;..    
2d900 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
2d910 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73  PagerSavepoint s
2d920 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20 61  tructures just a
2d930 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20  llocated. */.   
2d940 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74   for(ii=nCurrent
2d950 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b  ; ii<nSavepoint;
2d960 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2d970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2d980 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
2d990 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69     aNew[ii].nOri
2d9a0 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  g = pPager->dbSi
2d9b0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ze;.      if( is
2d9c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2d9d0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
2d9e0 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
2d9f0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2da00 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
2da10 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2da20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2da30 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2da40 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
2da50 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
2da60 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
2da70 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
2da80 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
2da90 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
2daa0 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
2dab0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2dac0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2dad0 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77  .      if( !aNew
2dae0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2daf0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t ){.        ret
2db00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2db10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2db20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2db30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2db40 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2db50 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  dy opened. */.  
2db60 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2db70 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2db80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2db90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2dba0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2dbb0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  d to rollback or
2dbc0 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
2dbd0 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ) a savepoint..*
2dbe0 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
2dbf0 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  to release or ro
2dc00 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20  llback need not 
2dc10 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  be the most rece
2dc20 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64  ntly .** created
2dc30 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
2dc40 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69  * Parameter op i
2dc50 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
2dc60 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2dc70 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  CK or SAVEPOINT_
2dc80 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69  RELEASE..** If i
2dc90 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2dca0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c  ELEASE, then rel
2dcb0 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79  ease and destroy
2dcc0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
2dcd0 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61  ith.** index iSa
2dce0 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69  vepoint. If it i
2dcf0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
2dd00 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62  BACK, then rollb
2dd10 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a  ack all changes.
2dd20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ** that have occ
2dd30 75 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73  ured since the s
2dd40 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
2dd50 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  nt was created..
2dd60 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  **.** The savepo
2dd70 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  int to rollback 
2dd80 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20 69 64  or release is id
2dd90 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
2dda0 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70  meter .** iSavep
2ddb0 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66  oint. A value of
2ddc0 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72   0 means to oper
2ddd0 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  ate on the outer
2dde0 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a  most savepoint.*
2ddf0 2a 20 28 74 68 65 20 66 69 72 73 74 20 63 72 65  * (the first cre
2de00 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f  ated). A value o
2de10 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  f (Pager.nSavepo
2de20 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65  int-1) means ope
2de30 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  rate.** on the m
2de40 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
2de50 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20  ated savepoint. 
2de60 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  If iSavepoint is
2de70 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
2de80 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
2de90 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73  nt-1), then this
2dea0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2deb0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2dec0 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
2ded0 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
2dee0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  s function, then
2def0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2df00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
2df10 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
2df20 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f   is different to
2df30 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
2df40 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
2df50 6b 28 29 20 62 65 63 61 75 73 65 20 74 68 69 73  k() because this
2df60 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2df70 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20  ot terminate.** 
2df80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2df90 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  or unlock the da
2dfa0 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20  tabase, it just 
2dfb0 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a  restores the .**
2dfc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2dfd0 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
2dfe0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e   original state.
2dff0 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63   .**.** In any c
2e000 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69  ase, all savepoi
2e010 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65  nts with an inde
2e020 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69  x greater than i
2e030 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72  Savepoint .** ar
2e040 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20  e destroyed. If 
2e050 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73  this is a releas
2e060 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d  e operation (op=
2e070 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2e080 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76  SE),.** then sav
2e090 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
2e0a0 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f  t is also destro
2e0b0 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  yed..**.** This 
2e0c0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
2e0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e0e0 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
2e0f0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
2e100 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  * or an IO error
2e110 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65   code if an IO e
2e120 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2e130 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  e rolling back a
2e140 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20   .** savepoint. 
2e150 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63  If no errors occ
2e160 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
2e170 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69   returned..*/ .i
2e180 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
2e190 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
2e1a0 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20  pPager, int op, 
2e1b0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
2e1c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e1d0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2e1e0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
2e1f0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
2e200 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2e210 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
2e220 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
2e230 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2e240 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28  LLBACK );..  if(
2e250 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67   iSavepoint<pPag
2e260 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
2e270 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  {.    int ii;   
2e280 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2e290 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2e2a0 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  .    int nNew;  
2e2b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e2c0 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73  r of remaining s
2e2d0 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20  avepoints after 
2e2e0 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20  this op. */..   
2e2f0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2e300 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e  ow many savepoin
2e310 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65  ts will still be
2e320 20 61 63 74 69 76 65 20 61 66 74 65 72 20 74 68   active after th
2e330 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  is.    ** operat
2e340 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ion. Store this 
2e350 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54  value in nNew. T
2e360 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63  hen free resourc
2e370 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  es associated . 
2e380 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73     ** with any s
2e390 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61  avepoints that a
2e3a0 72 65 20 64 65 73 74 72 6f 79 65 64 20 62 79 20  re destroyed by 
2e3b0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
2e3c0 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20      */.    nNew 
2e3d0 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28  = iSavepoint + (
2e3e0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2e3f0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72  LLBACK);.    for
2e400 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
2e410 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
2e420 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
2e430 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
2e440 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
2e450 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
2e460 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
2e470 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2e480 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
2e490 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2e4a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72   a rollback oper
2e4b0 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20  ation, playback 
2e4c0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
2e4d0 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20  vepoint..    ** 
2e4e0 49 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  If this is a tem
2e4f0 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f  p-file, it is po
2e500 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20  ssible that the 
2e510 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
2e520 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20  .    ** not yet 
2e530 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20  been opened. In 
2e540 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2e550 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
2e560 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74  nges to.    ** t
2e570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e580 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63  , so the playbac
2e590 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20  k operation can 
2e5a0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  be skipped..    
2e5b0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  */.    if( op==S
2e5c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2e5d0 4b 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  K && isOpen(pPag
2e5e0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2e5f0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
2e600 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
2e610 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67  nNew==0)?0:&pPag
2e620 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e  er->aSavepoint[n
2e630 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63  New-1];.      rc
2e640 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b   = pagerPlayback
2e650 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
2e660 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
2e670 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d       assert(rc!=
2e680 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20  SQLITE_DONE);.  
2e690 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
2e6a0 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61   this is a relea
2e6b0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  se of the outerm
2e6c0 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74  ost savepoint, t
2e6d0 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20  runcate .    ** 
2e6e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2e6f0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
2e700 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66   size. */.    if
2e710 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d  ( nNew==0 && op=
2e720 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2e730 53 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  SE && isOpen(pPa
2e740 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2e750 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2e760 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2e770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2e780 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
2e790 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->sjfd, 0);.    
2e7a0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2e7b0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
2e7c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e7d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2e7e0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2e7f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e800 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
2e810 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
2e820 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
2e830 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e840 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
2e850 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
2e860 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
2e870 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
2e880 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
2e890 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
2e8a0 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
2e8b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e8c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
2e8d0 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
2e8e0 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e  urn the file han
2e8f0 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  dle for the data
2e900 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
2e910 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
2e920 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69   pager.  This mi
2e930 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ght return NULL 
2e940 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a  if the file has.
2e950 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2e960 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  opened..*/.sqlit
2e970 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33  e3_file *sqlite3
2e980 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20  PagerFile(Pager 
2e990 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e9a0 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d  rn pPager->fd;.}
2e9b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e9c0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2e9d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2e9e0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
2e9f0 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
2ea00 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
2ea10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2ea20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
2ea30 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
2ea40 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2ea50 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
2ea60 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
2ea70 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
2ea80 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
2ea90 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
2eaa0 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
2eab0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2eac0 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
2ead0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2eae0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
2eaf0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2eb00 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
2eb10 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
2eb20 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
2eb30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2eb40 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20  agerSetCodec(.  
2eb50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
2eb60 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
2eb70 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2eb80 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
2eb90 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
2eba0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
2ebb0 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
2ebc0 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
2ebd0 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  odecArg;.}.#endi
2ebe0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2ebf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2ec00 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
2ec10 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
2ec20 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
2ec30 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2ec40 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
2ec50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2ec60 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
2ec70 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70   located at.** p
2ec80 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61  gno (which we ca
2ec90 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67  ll pPgOld) thoug
2eca0 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61  h that page is a
2ecb0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20  llowed to be.** 
2ecc0 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68  in cache.  If th
2ecd0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
2ece0 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  y located at pgn
2ecf0 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
2ed00 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
2ed10 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
2ed20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
2ed30 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
2ed40 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
2ed50 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2ed60 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
2ed70 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
2ed80 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
2ed90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
2eda0 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
2edb0 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
2edc0 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
2edd0 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
2ede0 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
2edf0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2ee00 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
2ee10 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
2ee20 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
2ee30 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
2ee40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
2ee50 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
2ee60 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
2ee70 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2ee80 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
2ee90 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
2eea0 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
2eeb0 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
2eec0 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
2eed0 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
2eee0 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
2eef0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2ef00 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a  n is active)..**
2ef10 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74  .** If the fourt
2ef20 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f  h argument, isCo
2ef30 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72  mmit, is non-zer
2ef40 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
2ef50 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f  e is being.** mo
2ef60 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ved as part of a
2ef70 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61   database reorga
2ef80 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65  nization just be
2ef90 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
2efa0 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e  tion .** is bein
2efb0 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20  g committed. In 
2efc0 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73  this case, it is
2efd0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2efe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
2eff0 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72  ge .** pPg refer
2f000 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s to will not be
2f010 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69   written to agai
2f020 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
2f030 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2f040 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2f050 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2f060 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
2f070 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2f080 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
2f090 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2f0a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2f0b0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
2f0c0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
2f0d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
2f0e0 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
2f0f0 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d  pgno, int isComm
2f100 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  it){.  PgHdr *pP
2f110 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  gOld;           
2f120 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2f130 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
2f140 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
2f150 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20  dSyncPgno = 0;  
2f160 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75       /* Old valu
2f170 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  e of pPg->pgno, 
2f180 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  if sync is requi
2f190 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  red */.  int rc;
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2f1c0 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
2f1d0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
2f1e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
2f1f0 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  age being moved 
2f200 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73  is dirty and has
2f210 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20   not been saved 
2f220 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  by the latest.  
2f230 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ** savepoint, th
2f240 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72  en save the curr
2f250 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
2f260 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
2f270 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
2f280 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  nal now. This is
2f290 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
2f2a0 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  dle the followin
2f2b0 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a  g scenario:.  **
2f2c0 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
2f2d0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
2f2e0 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f   page X, then mo
2f2f0 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72  dify it in memor
2f300 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45  y>.  **     SAVE
2f310 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20  POINT one;.  ** 
2f320 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65        <Move page
2f330 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59   X to location Y
2f340 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  >.  **     ROLLB
2f350 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a  ACK TO one;.  **
2f360 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20  .  ** If page X 
2f370 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e  were not written
2f380 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2f390 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75  nal here, it wou
2f3a0 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70  ld not.  ** be p
2f3b0 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f  ossible to resto
2f3c0 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  re its contents 
2f3d0 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
2f3e0 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20  CK TO one".  ** 
2f3f0 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69  statement were i
2f400 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  s processed..  *
2f410 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61  *.  ** subjourna
2f420 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64  lPage() may need
2f430 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
2f440 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d  ce to store pPg-
2f450 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20  >pgno into.  ** 
2f460 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
2f470 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54  point bitvecs. T
2f480 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f  his is the reaso
2f490 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
2f4a0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
2f4b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
2f4c0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
2f4d0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2f4e0 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69  .   && subjRequi
2f4f0 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
2f500 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
2f510 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2f520 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20  ge(pPg)).  ){.  
2f530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2f540 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2f550 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
2f560 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
2f570 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
2f580 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2f590 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2f5a0 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  , (pPg->flags&PG
2f5b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2f5c0 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f  :0, pgno));.  IO
2f5d0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
2f5e0 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
2f5f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
2f600 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  o))..  /* If the
2f610 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
2f620 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
2f630 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70  fore page pPg->p
2f640 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20  gno can.  ** be 
2f650 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72  written to, stor
2f660 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c  e pPg->pgno in l
2f670 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65  ocal variable ne
2f680 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a  edSyncPgno..  **
2f690 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43  .  ** If the isC
2f6a0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
2f6b0 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  t, there is no n
2f6c0 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2f6d0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  that.  ** the jo
2f6e0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
2f6f0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
2f700 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
2f710 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20  pPg->pgno .  ** 
2f720 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
2f730 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
2f740 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
2f750 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
2f760 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  to it..  */.  if
2f770 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2f780 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26  HDR_NEED_SYNC) &
2f790 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  & !isCommit ){. 
2f7a0 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
2f7b0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
2f7c0 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
2f7d0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
2f7e0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2f7f0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
2f800 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2f810 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2f820 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
2f830 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2f840 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  c );.  }..  /* I
2f850 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
2f860 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
2f870 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
2f880 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
2f890 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  * from its hash 
2f8a0 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
2f8b0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
2f8c0 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
2f8d0 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
2f8e0 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
2f8f0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
2f900 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
2f910 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
2f920 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
2f930 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
2f940 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
2f950 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67  NEED_SYNC;.  pPg
2f960 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
2f970 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
2f980 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
2f990 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e  Old || pPgOld->n
2f9a0 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Ref==1 );.  if( 
2f9b0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50  pPgOld ){.    pP
2f9c0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67  g->flags |= (pPg
2f9d0 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  Old->flags&PGHDR
2f9e0 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d  _NEED_SYNC);.  }
2f9f0 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
2fa00 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
2fa10 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
2fa20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
2fa30 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b  cheDrop(pPgOld);
2fa40 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50  .  }..  sqlite3P
2fa50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
2fa60 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
2fa70 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
2fa80 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
2fa90 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
2faa0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
2fab0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2fac0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fad0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
2fae0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
2faf0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
2fb00 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
2fb10 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
2fb20 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
2fb30 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
2fb40 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
2fb50 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
2fb60 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
2fb70 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
2fb80 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
2fb90 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
2fba0 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
2fbb0 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
2fbc0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
2fbd0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
2fbe0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
2fbf0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
2fc00 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
2fc10 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
2fc20 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
2fc30 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
2fc40 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
2fc50 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
2fc60 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
2fc70 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
2fc80 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
2fc90 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
2fca0 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
2fcb0 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
2fcc0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
2fcd0 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
2fce0 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
2fcf0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2fd00 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
2fd10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
2fd20 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
2fd30 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
2fd40 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
2fd50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2fd60 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
2fd70 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
2fd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fd90 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
2fda0 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
2fdb0 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
2fdc0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
2fdd0 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
2fde0 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
2fdf0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
2fe00 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
2fe10 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
2fe20 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
2fe30 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50  oo..    */.    P
2fe40 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
2fe50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fe60 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
2fe70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fe80 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
2fe90 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
2fea0 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
2feb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fec0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2fed0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->pInJournal && 
2fee0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
2fef0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2ff00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ff10 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
2ff20 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2ff30 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29  l, needSyncPgno)
2ff40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ff50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ff60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
2ff70 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61  dSync = 1;.    a
2ff80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2ff90 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d  oSync==0 && !MEM
2ffa0 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72  DB );.    pPgHdr
2ffb0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2ffc0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2ffd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2ffe0 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
2fff0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30000 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
30010 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
30020 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
30030 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
30040 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30050 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
30060 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
30070 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
30080 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
30090 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
300a0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
300b0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
300c0 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
300d0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
300e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
300f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
30100 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
30110 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
30120 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
30130 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
30140 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
30150 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
30160 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
30170 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
30180 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
30190 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
301a0 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70  n (pPager?pPg->p
301b0 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Extra:0);.}../*.
301c0 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
301d0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
301e0 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
301f0 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
30200 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
30210 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30220 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
30230 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
30240 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
30250 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
30260 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
30270 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
30280 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
30290 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
302a0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
302b0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
302c0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
302d0 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
302e0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
302f0 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
30300 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30310 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
30320 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
30330 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
30340 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
30350 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
30360 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
30370 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
30380 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
30390 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
303a0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
303b0 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
303c0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
303d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
303e0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
303f0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
30400 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30410 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
30420 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
30430 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
30440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
30450 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30460 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
30470 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
30480 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
30490 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
304a0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
304b0 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
304c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
304d0 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
304e0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
304f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
30500 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
30510 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
30520 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
30530 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
30540 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
30550 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
30560 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
30570 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
30580 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30590 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
305a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
305b0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
305c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
305d0 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
305e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
305f0 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52  _OFF.**    PAGER
30600 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
30610 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ORY.**.** If the
30620 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
30630 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74  t _QUERY, then t
30640 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
30650 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
30660 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
30670 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
30680 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
30690 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
306a0 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
306b0 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
306c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
306d0 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
306e0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
306f0 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44  de){.  if( !MEMD
30700 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
30710 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
30720 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
30740 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
30750 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
30760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
30770 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
30780 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
30790 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ATE.            
307a0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
307b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
307c0 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20  RSIST.          
307d0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
307e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
307f0 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
30800 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
30810 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
30820 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73 73  EMORY );.    ass
30830 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
30840 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
30850 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3e  ;.    if( eMode>
30860 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
30870 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
30880 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
30890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
308a0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
308b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
308c0 55 45 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20  UERY );.    }.  
308d0 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
308e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
308f0 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
30900 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c  t/set the size-l
30910 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65  imit used for pe
30920 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
30930 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73   files..*/.i64 s
30940 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
30950 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
30960 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
30970 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
30980 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
30990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
309a0 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
309b0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
309c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
309d0 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  izeLimit;.}../*.
309e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
309f0 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65  ter to the pPage
30a00 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61  r->pBackup varia
30a10 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20  ble. The backup 
30a20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63  module.** in bac
30a30 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20  kup.c maintains 
30a40 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
30a50 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68  his variable. Th
30a60 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65  is module.** use
30a70 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73  s it opaquely as
30a80 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
30a90 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
30aa0 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71  tart() and.** sq
30ab0 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
30ac0 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c  e() only..*/.sql
30ad0 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71  ite3_backup **sq
30ae0 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70  lite3PagerBackup
30af0 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Ptr(Pager *pPage
30b00 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50  r){.  return &pP
30b10 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d  ager->pBackup;.}
30b20 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
30b30 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
30b40 2f 0a                                            /.